2017-08-13 53 views
0

我有以下存储过程,它为无限滚动页返回行。我怎样才能检查newTable是空的?如果它是空的,那么我不希望UNION SELECT被执行。请注意,newTable是一个非常复杂的查询,所以我不想多执行一次。只有当第一个选择不为空时才运行UNION SELECT

@offset INT, 
@fetch INT 
WITH newTable AS 
(
SELECT * FROM table1 
ORDER BY id OFFSET @offset ROWS FETCH NEXT @fetch ROWS ONLY 
) 

不要运行下面如果newtable中已经到达最后一行是空

SELECT * FROM newTable 
UNION 
SELECT * FROM table3 
UNION 
SELECT * FROM table4 
ORDER BY id 

回答

1

你或许可以做这样的事情:

DECLARE @offset INT, 
     @fetch INT; 

WITH newTable AS 
(
SELECT * FROM table1 
ORDER BY id OFFSET @offset ROWS FETCH NEXT @fetch ROWS ONLY 
) 
SELECT * 
FROM newTable 
UNION 
SELECT * 
FROM table3 
WHERE EXISTS (SELECT 1 FROM newTable) 
UNION 
SELECT * 
FROM table4 
WHERE EXISTS (SELECT 1 FROM newTable) 
ORDER BY id 

我很确定它不会再次执行cte。如果是这样,你可以使用临时表而不是cte:

SELECT <ColumnsList> INTO #TemporaryTable 
FROM.... 

然后你的UNION查询。

SELECT * 
FROM #TemporaryTable 
UNION 
SELECT * 
FROM table3 
WHERE EXISTS (SELECT 1 FROM #TemporaryTable) 
UNION 
SELECT * 
FROM table4 
WHERE EXISTS (SELECT 1 FROM #TemporaryTable) 
ORDER BY id 
相关问题