programing

하나의 Postgre에서 여러 WITH 문을 사용하는 방법SQL 쿼리?

skycolor 2023. 6. 16. 21:35
반응형

하나의 Postgre에서 여러 WITH 문을 사용하는 방법SQL 쿼리?

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

는 Postgre를 읽었습니다.SQL 문서화 및 다중 사용에 대한 연구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_2table_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
;

일반적으로 존재하는 방식을 그대로 유지하려면 에 사용하는 것보다 더 낫지만 실제로 사용할 수 있는 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);

WITH 문을 사용하여 결과를 연결할 수도 있습니다.예:

WITH tab1 as (Your SQL statement),
tab2 as ( SELECT ... FROM tab1 WHERE your filter),
tab3 as ( SELECT ... FROM tab2 WHERE your filter)
SELECT * FROM tab3;

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

반응형