PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak używać wielu instrukcji WITH w jednym zapytaniu PostgreSQL?

Zgodnie z innymi komentarzami drugie wspólne wyrażenie tabelowe [CTE] jest poprzedzone przecinkiem, a nie instrukcją WITH, więc

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

Jeśli chodzi o twoje aktualne zapytanie, ta składnia powinna działać w PostgreSql, Oracle i sql-server, cóż później zwykle będziesz kontynuował WITH ze średnikiem (;WTIH ), ale dzieje się tak dlatego, że zazwyczaj użytkownicy serwera sql (w tym ja) nie kończą poprzednich instrukcji, które muszą zostać zakończone przed zdefiniowaniem CTE...

Pamiętaj jednak, że miałeś drugi problem ze składnią w odniesieniu do Twojego WHERE oświadczenie. WHERE date IN table_2 jest nieprawidłowa, ponieważ nigdy nie odwołujesz się do wartości/kolumny z tabeli_2. Wolę INNER JOIN przez IN lub Exists więc oto składnia, która powinna działać z 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
;

Jeśli chcesz zachować to, co masz, które zazwyczaj EXISTS byłoby lepsze niż IN, ale aby użyć IN, potrzebujesz rzeczywistej instrukcji SELECT w swoim miejscu.

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

IN jest bardzo problematyczne, gdy date może potencjalnie być NULL więc jeśli nie chcesz używać JOIN wtedy sugerowałbym EXISTS . W następujący sposób:

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. Sparametryzowana PostgreSQL funkcja Order By / Limit w tabeli

  2. GROUP BY i agregacja kolejnych wartości liczbowych

  3. Jak stworzyć użytkownika dla bazy danych w postgresql?

  4. Jaka jest różnica między cudzysłowami pojedynczymi a cudzysłowami podwójnymi w PostgreSQL?

  5. Jak zadeklarować zmienną w PostgreSQL