PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menggunakan beberapa pernyataan WITH dalam satu kueri PostgreSQL?

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);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa menggabungkan kolom dari dua tabel menjadi satu output?

  2. Mengambil Komentar dari DB PostgreSQL

  3. Resolusi milidetik dari DateTime di Ruby

  4. Apakah ada jalan pintas untuk SELECT * FROM?

  5. Bagaimana cara mendapatkan nama zona waktu saat ini di Postgres 9.3?