Berdasarkan komentar lainnya, Common Table Expression [CTE] kedua diawali dengan koma, bukan pernyataan WITH
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
Dalam hal kueri Anda yang sebenarnya, sintaks ini harus berfungsi di PostgreSql, Oracle, dan sql-server, nah nanti biasanya Anda akan melanjutkan WITHdengan titik koma ( ;WTIH), tetapi itu karena biasanya orang-orang sql-server (termasuk saya sendiri) tidak berakhir pernyataan sebelumnya yang harus diakhiri sebelum CTE didefinisikan ...
Namun perlu dicatat bahwa Anda memiliki masalah sintaks kedua sehubungan dengan WHEREpernyataan Anda . WHERE date IN table_2tidak valid karena Anda sebenarnya tidak pernah mereferensikan nilai / kolom dari table_2. Saya lebih suka INNER JOINlebih INatau Existslebih 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 dateberpotensi NULLjadi jika Anda tidak ingin menggunakan JOINmaka saya sarankan EXISTS. Sebagai berikut:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
withpernyataan kedua dan tanda koma lainnya setelahnya. Tidak yakin tentang postgres tetapi itu sintaks normal dengan Oracle dan sql server