Theo các nhận xét khác, Biểu thức bảng chung thứ hai [CTE] được đặt trước bằng dấu phẩy không phải là câu lệnh WITH vì vậy
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
Về mặt truy vấn thực tế của bạn, cú pháp này sẽ hoạt động trong PostgreSql, Oracle và sql-server, thường thì sau này bạn sẽ tiếp tục WITH
có dấu chấm phẩy (;WTIH
).
Tuy nhiên, lưu ý rằng bạn đã gặp vấn đề cú pháp thứ hai liên quan đến WHERE
của bạn tuyên bố. WHERE date IN table_2
không hợp lệ vì bạn không bao giờ thực sự tham chiếu một giá trị / cột từ bảng_2. Tôi thích INNER JOIN
over IN
hoặc Exists
vì vậy đây là một cú pháp sẽ hoạt động với 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
;
Nếu bạn muốn giữ theo cách bạn đã có, thường là EXISTS sẽ tốt hơn IN nhưng để sử dụng IN, bạn cần có một câu lệnh SELECT thực tế trong where của bạn.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN rất có vấn đề khi date
có thể là NULL
vì vậy nếu bạn không muốn sử dụng JOIN
thì tôi sẽ đề xuất EXISTS
. NHƯ sau:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);