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, về sau, bạn thường sẽ tiếp tục WITH
với dấu chấm phẩy ( ;WTIH
), nhưng đó là bởi vì thông thường sql-server folks (tôi bao gồm) không kết thúc các câu lệnh trước đó cần được kết thúc trước khi CTE được xác định ...
Tuy nhiên, lưu ý rằng bạn đã gặp vấn đề cú pháp thứ hai liên quan đến WHERE
câu lệnh của mình . 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
hơn IN
hoặc Exists
hơn đây là một cú pháp nên 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 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ể xảy ra 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);
with
câu lệnh thứ hai bất kỳ câu lệnh nào khác sau đó. Không chắc chắn về postgres nhưng đó là cú pháp bình thường với Oracle và máy chủ sql