Programing

하나의 PostgreSQL 쿼리에서 여러 WITH 문을 사용하는 방법은 무엇입니까?

crosscheck 2020. 12. 30. 19:02
반응형

하나의 PostgreSQL 쿼리에서 여러 WITH 문을 사용하는 방법은 무엇입니까?


WITH 문을 사용하여 효과적으로 여러 TEMP 테이블이 무엇인지 "선언"하고 싶습니다. 실행하려는 쿼리는 다음과 같습니다.

WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)

WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)

SELECT * FROM table_1
WHERE date IN table_2

PostgreSQL 문서를 읽고 여러 WITH을 사용하는 방법을 조사 했지만 답을 찾을 수 없었습니다.


다른 주석마다 두 번째 공통 테이블 표현식 [CTE] 앞에 WITH 문이 아닌 쉼표가옵니다.

WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
    cte1 c1
    INNER JOIN cte2 c2
    ON ........

실제 쿼리 측면에서이 구문은 PostgreSql, Oracle 및 sql-server에서 작동해야합니다. 나중에 일반적으로 WITH세미콜론 ( ;WTIH)으로 진행할 것이지만 일반적으로 sql-server 사용자 (자신 포함)가 끝나지 않기 때문입니다. CTE가 정의되기 전에 종료되어야하는 이전 진술 ...

그러나 WHERE진술 과 관련하여 두 번째 구문 문제가 있음을 유의하십시오 . WHERE date IN table_2실제로 table_2에서 값 / 열을 참조하지 않기 때문에 유효하지 않습니다. 내가 선호 INNER JOIN이상 IN또는 Exists그래서 여기에 작업을해야 구문은 JOIN:

WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)

, table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)

SELECT * 
FROM
     table_1 t1
     INNER JOIN 
     table_2 t2
     ON t1.date = t2.date
;

일반적으로 EXISTS가 IN보다 낫지 만 IN을 사용하려면 실제 SELECT 문이 필요합니다.

SELECT * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

IN 때 매우 문제가 date잠재적으로 수 NULL당신이 사용하지 않을 경우, 그래서 JOIN나는이 제안 EXISTS. 다음과 같이 :

SELECT * 
FROM
     table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);

참조 URL : https://stackoverflow.com/questions/38136854/how-to-use-multiple-with-statements-in-one-postgresql-query

반응형