0

您好我有一个CTE有5个内部联接和一个where子句减少一个。 示例代码如下所示。但实际的代码有更复杂的逻辑避免多重联合所有在cte

;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时,union之间的所有选项都应该随着更改where子句重复,如a1.offset = a2.quarter-2到a1.offset = a2.quarter-n 请建议

回答

0

这应该仅仅是:

;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点。