【问题标题】:SELECT from multiple cte with dynamic WHERE condition从具有动态 WHERE 条件的多个 cte 中选择
【发布时间】:2019-02-18 07:24:02
【问题描述】:

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

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

在其他情况下(type=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*\

谢谢

【问题讨论】:

  • 我在 WHERE 中尝试了案例。但我担心性能。将 2 个进程拆分为 2 个 sp 会更好吗?
  • 首先,检查参数嗅探问题,或者你可以放执行计划看看发生了什么,但到目前为止,这个问题是题外话,因为你没有问题,因为你的代码是工作
  • @BudaGavril 嗨。我面临的问题是限制没有。选择的记录,如果@type=1.. 如果@type=2,则选择所有。 IF 不能使用,因为它在 cte 之后。案例会对性能产生很大影响吗?

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


【解决方案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 行,否则它将全部返回。

【讨论】:

    【解决方案2】:

    使用union all

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

    【讨论】:

    • 嗨.. 我如何过滤号码。选择的记录?在类型 1.. 中应该是 10 条记录;我输入2,所有记录都被选中
    • @needtoflow 在 cte 1 中选择前 10 个记录并在 cte2 中选择全部然后通过联合全部合并
    • 嗨,我不能在 cte 中使用 select top 10;我需要 cte 中的所有记录,然后根据用户在网格中选择的页码过滤 10 条记录。这是第一种情况。
    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多