0

안녕하세요 저는 5 개의 내부 조인과 하나씩 줄이는 where 절이있는 CTE를 가지고 있습니다. 샘플 코드는 다음과 같습니다. 그러나 실제 코드는 더 복잡한 논리를 가지고있다.여러 노동 조합을 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을 전달할 때와 같은 것을 원합니다. 합집합 사이의 선택 항목은 a1.offset = a2.quarter-2에서 a1.offset = a2.quarter-n과 같이 변경되는 where 절로 반복해야합니다.

을 제안하십시오.

답변

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 제거 할 수 없다는 대한 요점을 이해하지 않습니다.

관련 문제