Per komentar lain, Ekspresi Tabel Umum kedua [CTE] didahului oleh koma bukan pernyataan WITH jadi
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
Dalam hal permintaan Anda yang sebenarnya sintaks ini harus bekerja di PostgreSql, Oracle, dan sql-server, baik nanti biasanya Anda akan melanjutkan WITH
dengan titik koma (;WTIH
), tetapi itu karena biasanya orang-orang sql-server (termasuk saya sendiri) tidak mengakhiri pernyataan sebelumnya yang perlu diakhiri sebelum CTE didefinisikan...
Namun perhatikan bahwa Anda memiliki masalah sintaksis kedua sehubungan dengan WHERE
your Anda penyataan. WHERE date IN table_2
tidak valid karena Anda tidak pernah benar-benar mereferensikan nilai/kolom dari table_2. Saya lebih suka INNER JOIN
lebih dari IN
atau Exists
jadi di sini adalah sintaks yang harus bekerja dengan 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
;
Jika Anda ingin mempertahankan cara Anda memilikinya yang biasanya EXISTS akan lebih baik daripada IN tetapi untuk menggunakan IN Anda memerlukan pernyataan SELECT yang sebenarnya di tempat Anda.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN sangat bermasalah ketika date
berpotensi menjadi NULL
jadi jika Anda tidak ingin menggunakan JOIN
maka saya akan menyarankan EXISTS
. SEBAGAI berikut:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);