2017-12-22 26 views
1

큰 SQL 표현식과 복잡한 쿼리를 생성하는 시스템을 작성하고 있습니다. 내 자신의 성실함을 위해 코드 생성기를 사용하여 코드를 단순화하고 약간 더 읽기 쉽게 만드는 표현식을 사용하고 있습니다 (여전히 생성되는 공포의 예 : https://pastebin.com/UZJ01Q19)CTE (With 문 포함)는 PostgreSQL에서 공통 하위 식 제거를 허용합니까?

일부 지역에서는 원하는대로 ComplexQuery이 식에서 회 평가되는 경우, 임의의 횟수 복합 표현식의 결과를 재사용하고, I는 예를 들어, 결합 된 발현의 평가 횟수 궁금하면, 방법으로는

WITH ... AS <DoSetup>, 
intermediate AS <ComplexQuery> 
SELECT a, b FROM 
    (SELECT * FROM intermediate WHERE ...) 
    UNION 
    (SELECT * FROM intermediate WHERE ...) 

있다

표현식을 한 번만 평가하는 방식으로 다시 작성 하시겠습니까? 임시보기를 만드는 방법을 살펴 보았지만 모든 액세스에 대해 하위 쿼리를 다시 평가하는 것으로 보입니다.

답변

2

CTE를 사용할 때마다보기를 사용할 때마다 하위 쿼리가 다시 실행되지 않는다고 확신합니다. 쿼리를 한 번 평가하고 여러 번 참조해야합니다. Explain 플랜을 실행하면 기본 테이블에 한 번만 액세스 할 수 있음을 보여줍니다.

enter image description here

나는 주제에 대한 권위 아니에요, 나는이 잘못 읽고 있어요 경우 누군가가 저를 해결 것이라고 믿습니다.

위의 예가 관련성이있는 경우 단순한 OR 절을 사용하여 CTE와의 결합을 피할 수 있습니다. 예를 들어, 다음과 같습니다 경우 :

select * from intermediate where a = 1 and b < 50 
union 
select * from intermediate where a >= 0 and c > 99 

당신은 단순히 같이 다시 쓸 수있다 : 다시

select * 
from intermediate 
where 
    (a = 1 and b < 50) or 
    (a >= 0 and c > 99) 

, 어쩌면 당신의 예를 근본적으로 과도하게 단순화했지만, 나는이 많이 보여요 - 노동 조합을 그 or으로 더 잘 작동합니다. union에는 일종의 계산이 필요하다는 점에 유의하십시오.

+0

감사합니다. 노조를 사용하는 예가 실제로 지나치게 단순화되었습니다. 쿼리를 여러 번 다시 사용할 수있는 간단한 방법을 선택하려고했습니다. 그러나 그것은 제가 염두에 두어야 할 것입니다. – Xandros