PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để sử dụng nhiều câu lệnh WITH trong một truy vấn PostgreSQL?

Theo các nhận xét khác, Biểu thức bảng chung thứ hai [CTE] được đặt trước bằng dấu phẩy không phải là câu lệnh WITH vì vậy

WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
    cte1 c1
    INNER JOIN cte2 c2
    ON ........

Về mặt truy vấn thực tế của bạn, cú pháp này sẽ hoạt động trong PostgreSql, Oracle và sql-server, thường thì sau này bạn sẽ tiếp tục WITH có dấu chấm phẩy (;WTIH ).

Tuy nhiên, lưu ý rằng bạn đã gặp vấn đề cú pháp thứ hai liên quan đến WHERE của bạn tuyên bố. WHERE date IN table_2 không hợp lệ vì bạn không bao giờ thực sự tham chiếu một giá trị / cột từ bảng_2. Tôi thích INNER JOIN over IN hoặc Exists vì vậy đây là một cú pháp sẽ hoạt động với 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
;

Nếu bạn muốn giữ theo cách bạn đã có, thường là EXISTS sẽ tốt hơn IN nhưng để sử dụng IN, bạn cần có một câu lệnh SELECT thực tế trong where của bạn.

SELECT * 
FROM
     table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);

IN rất có vấn đề khi date có thể là NULL vì vậy nếu bạn không muốn sử dụng JOIN thì tôi sẽ đề xuất EXISTS . NHƯ sau:

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. Cách triển khai các ưu tiên trong SQL (postgres)

  2. Nhận Id từ CHÈN có điều kiện

  3. Có thể xác định các biến toàn cục trong postgresql không

  4. Lỗi cú pháp tại hoặc gần người dùng khi thêm ràng buộc Postgres

  5. Truy vấn đệ quy Postgres với row_to_json