Sql server 2008 r2 避免cte中的多个接头

Sql server 2008 r2 避免cte中的多个接头,sql-server-2008-r2,where-clause,common-table-expression,union-all,Sql Server 2008 R2,Where Clause,Common Table Expression,Union All,嗨,我有一个有5个内部联接的CTE和一个减少了1的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 *, -

嗨,我有一个有5个内部联接的CTE和一个减少了1的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。偏移量=a2。四分之一-4。 如何避免同一代码只为一个where子句值重复这么多次。实际查询有5个内部联接,总共有5个union all。 我不能完全删除并集,因为这样会产生一些计算差异。 我想要的是,当我们传递一个整数值n时,在并集之间的选择都应该重复,并更改where子句,如a1.offset=a2.quarter-2到a1.offset=a2.quarter-n 请建议这应该是:

;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
的观点