从具有动态WHERE条件的多个CTE中进行选择

时间:2019-02-18 07:24:03

标签: sql sql-server sql-server-2014 sqlperformance

我有一个存储过程,该过程返回记录列表。

在一种情况下(类型= 1),这将根据页码返回前10条记录。

在其他情况下(类型= 2),这将返回所有记录。

两种情况下选择的列都是相同的。

我正在使用2个cte来获取所需的数据。

如何实现确定否的动态部分。选择的记录数;对性能的影响最小。

代码蓝图

with cte1 as 
(
    SELECT ....
),
cte2 as 
(
    SELECT ....
)
SELECT 
    ROW_NUMBER() OVER ( ORDER BY Col1) AS RowId,
    cte1.*, cte2.PlanName
FROM 
    cte1 
INNER JOIN
    cte2 ON cte2.Id = cte1.Id 
WHERE
    .....\*different code here*\

谢谢

2 个答案:

答案 0 :(得分:1)

您可以设置WHERE之类的where (RowId <=10 and @case=1) or @case=2条件

您的查询应如下所示。

SELECT * 
FROM   (SELECT Row_number() 
                 OVER ( 
                   ORDER BY col1) AS RowId, 
               cte1.*, 
               cte2.planname 
        FROM   cte1 
               INNER JOIN cte2 
                       ON cte2.id = cte1.id)t 
WHERE  ( rowid <= 10 
         AND @case = 1 ) 
        OR @case = 2 

如果上面的case=1代码将仅基于您的row_number()返回10行,否则它将返回全部。

答案 1 :(得分:0)

使用union all

with cte1 as (SELECT ....) ,

cte2 as (SELECT ....) select * from cte union all select * cte2