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 WITH
dengan 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 WHERE
pernyataan Anda . WHERE date IN table_2
tidak valid karena Anda sebenarnya tidak pernah mereferensikan nilai / kolom dari table_2. Saya lebih suka INNER JOIN
lebih IN
atau Exists
lebih 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 NULL
jadi jika Anda tidak ingin menggunakan JOIN
maka saya sarankan EXISTS
. Sebagai berikut:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
pernyataan kedua dan tanda koma lainnya setelahnya. Tidak yakin tentang postgres tetapi itu sintaks normal dengan Oracle dan sql server