2016-07-01 1 views
22

WITH 문을 사용하여 효과적으로 여러 TEMP 테이블을 선언하고 싶습니다. 내가 실행하려고 쿼리의 라인을 따라입니다 : 내가 PostgreSQL documentation을 읽고 연구 다수에게 WITH 문을 사용으로하고 답을 찾을 수 없습니다했습니다하나의 PostgreSQL 쿼리에서 여러 개의 WITH 문을 사용하는 방법은 무엇입니까?

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 

. 두 번째 공통 테이블 표현식 [CTE가] 쉼표 앞에 다른 코멘트를

+0

두 번째'앞에'명령문 앞에 쉼표를 사용하십시오. postgres에 대해서는 확실하지 않지만 오라클과 SQL 서버의 일반적인 구문은 – mo2

+0

입니다. 쉼표를 사용하고 나중에 세미콜론을 사용했지만 구문 오류가 계속 발생했습니다. '오류 : 쉼표의 WITH "또는"근처의 구문 오류 및 쉼표의 오류 : 세미콜론의 경우 "또는"근처에서 구문 오류가 발생합니다. – Greg

답변

39

아닌 실제 쿼리의 측면에서 문 그래서

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

이 구문은 PostgreSQL을, 오라클 및 SQL에서 작동합니다 -server, 나중에 일반적으로 WITH을 세미콜론 (;WTIH)으로 처리하지만, 이는 일반적으로 SQL Server 서버 사용자 (본인 포함)가 CTE를 정의하기 전에 종료해야하는 이전 명령문을 종료하지 않기 때문입니다. .

그러나 두 번째 문법 문제는 요에 관한 것입니다. ur WHERE 성명. WHERE date IN table_2은 실제로 table_2에서 값/열을 참조하지 않으므로 유효하지 않습니다. 내가 IN 정도 여기 Exists 이상 INNER JOIN을 선호 함께 작동합니다 구문입니다 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 당신이 그것을 가지고 방식을 유지하지만에서 사용하려면 당신의 실제 SELECT 문이 필요합니다. 당신이이 JOIN 다음 내가 EXISTS을 제안 사용하지 않으 그렇다면 date 잠재적 NULL 할 수있을 때

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

는 IN은 매우 문제가있다. 다음과 같습니다 :

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

깊이있는 설명 주셔서 감사합니다. 구문은 작동했습니다. – Greg

+0

도움이 되니 기쁩니다. IN을 사용하지 않는 것에 대한 기사를 찾을 수는 없지만 IN을 통해 JOIN 또는 EXISTS를 사용하는 것이 좋습니다. 결과 세트에 널 (null)이 있으면 사용자가 원하는 레코드 만 얻지 못하게됩니다. 이상하지만 대부분의 RDBM이 작동하는 방식입니다. 그것에 대한 검색을 시도해보십시오, 나는 그것에 대해 본이 사이트에 너무 좋은 대답을 알고 ... 어쨌든, 좋은 밤을 보내십시오 – Matt

+0

당신은 저에게 많은 시간을 저축 한 사람입니다, 감사합니다 !!! – Juan