다른 주석에서 두 번째 공통 테이블 표현식 [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
그렇게 될 수있을 때 매우 문제가 될 수 있습니다. 만약 당신이 a를 사용하고 싶지 않다면 JOIN
나는 EXISTS
. 다음과 같이 :
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
문 앞에 쉼표를 사용하십시오 . postgres에 대해서는 확실하지 않지만 Oracle과 SQL 서버의 일반적인 구문입니다