Saya ingin "mendeklarasikan" apa yang secara efektif merupakan beberapa tabel TEMP menggunakan pernyataan WITH. Kueri yang saya coba jalankan berada di sepanjang baris:
WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)
WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)
SELECT * FROM table_1
WHERE date IN table_2
Saya telah membaca dokumentasi PostgreSQL dan meneliti menggunakan beberapa WITH
pernyataan dan tidak dapat menemukan jawabannya.
with
pernyataan kedua dan tanda koma lainnya setelahnya. Tidak yakin tentang postgres tetapi itu sintaks normal dengan Oracle dan sql serverERROR: syntax error at or near "WITH"
untuk koma danERROR: syntax error at or near ";"
untuk titik koma.Jawaban:
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 sukaINNER JOIN
lebihIN
atauExists
lebih di sini adalah sintaks yang harus bekerja denganJOIN
: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
berpotensiNULL
jadi jika Anda tidak ingin menggunakanJOIN
maka saya sarankanEXISTS
. Sebagai berikut:SELECT * FROM table_1 t1 WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
sumber
Anda juga dapat merangkai hasil Anda menggunakan pernyataan WITH. Misalnya:
WITH tab1 as (Your SQL statement), tab2 as ( SELECT ... FROM tab1 WHERE your filter), tab3 as ( SELECT ... FROM tab2 WHERE your filter) SELECT * FROM tab3;
sumber