복붙노트

[SQL] 어떻게 PostgreSQL의 쿼리 문 여러 사용 하는가?

SQL

어떻게 PostgreSQL의 쿼리 문 여러 사용 하는가?

나는 효과적으로 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의 문서를 읽고 제표를 여러 개 사용으로 연구하고 답을 찾을 수 없습니다했습니다.

해결법

  1. ==============================

    1.두 번째 공통 테이블 표현식 [CTE가] 쉼표 그렇게하지 않는 WITH 문 앞에는 다른 의견 당

    두 번째 공통 테이블 표현식 [CTE가] 쉼표 그렇게하지 않는 WITH 문 앞에는 다른 의견 당

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

    실제 쿼리의 관점에서이 구문이 아니라 나중에 일반적으로는 세미콜론 (;)으로 진행합니다, PostgreSQL을, 오라클 및 SQL 서버에서 작동합니다 (; WTIH), 그러나 일반적으로 SQL 서버 사람들이 (자신 포함) 돈 때문이다 필요 't 끝 이전 문은 CTE 이전에 정의 된 종료합니다 ...

    당신이 당신의 WHERE 문에 관해서 두 번째 구문 문제가 있다고하지만 있습니다. 실제로 table_2에서 값 / 열을 참조하지 않기 때문에 table_2 날짜가 유효하지 않습니다 WHERE. 나는 INNER IN을 통해 가입 또는 그래서 여기에 존재하는 것은이 가입 작업을해야 구문입니다 선호 :

    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 문을 필요로 사용하여보다하지만, 더 나은 것 EXISTS 당신이 그것을 가지고 방법을 계속합니다.

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

    당신은 그때 내가 제안 EXISTS 가입 사용하지 않을 그래서 만약 날짜가 잠재적으로 NULL이 될 수있을 때 IN은 매우 문제가있다. AS는 다음과 같습니다 :

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

    2.당신은 문을 사용하여 결과를도를 체인 수 있습니다. 예 :

    당신은 문을 사용하여 결과를도를 체인 수 있습니다. 예 :

    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;
    
  3. from https://stackoverflow.com/questions/38136854/how-to-use-multiple-with-statements-in-one-postgresql-query by cc-by-sa and MIT license