【问题标题】:avoid multiple union all in cte在 cte 中避免多个联合
【发布时间】:2014-03-13 13:00:39
【问题描述】:

您好,我有一个带有 5 个内部连接的 CTE 和一个减一的 where 子句。 示例代码如下所示。但实际代码逻辑更复杂

;With CTE_EG AS
(
 select *,
-1 as offset from a 
 inner join a1 on a1.id=a.id
 inner join a2 on a1.id=a2.id
 inner join a3 on a1.id=a3.id
where a1.offset = a2.quarter-1
union all
 select *,
-2 as offset from a 
 inner join a1 on a1.id=a.id
 inner join a2 on a1.id=a2.id
 inner join a3 on a1.id=a3.id
where a1.offset = a2.quarter-2
union all
   ...
    )

这会重复直到偏移量 -4 和 a1.offset = a2.quarter-4。 我怎样才能避免只为一个 where 子句值重复相同的代码很多次。实际上查询有 5 个内部连接,总共有 5 个联合。 我不能全部删除联合,因为这会产生一些计算差异。 我想要类似当我们传递一个整数值 n 时,联合之间的选择都应该随着改变 where 子句(如 a1.offset = a2.quarter-2 到 a1.offset = a2.quarter-n)而重复 请推荐

【问题讨论】:

    标签: sql-server-2008-r2 where-clause common-table-expression union-all


    【解决方案1】:

    这应该只是:

    ;With Numbers(n) as (
      select 1 union all select 2 union all
      select 3 union all select 4
    ), CTE_EG AS
    (
     select *,
    -n as offset from a 
     inner join a1 on a1.id=a.id
     inner join a2 on a1.id=a2.id
     inner join a3 on a1.id=a3.id
     inner join numbers n on a1.offset = a2.quarter-n
     )
    

    我不明白你关于无法删除 UNION ALL 的观点。

    【讨论】:

      猜你喜欢
      • 2012-07-17
      • 2012-10-19
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多