PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come utilizzare più istruzioni WITH in una query PostgreSQL?

Per gli altri commenti la seconda Common Table Expression [CTE] è preceduta da una virgola non da un'istruzione WITH quindi

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

In termini di query effettiva, questa sintassi dovrebbe funzionare in PostgreSql, Oracle e sql-server, in genere in seguito si procederà WITH con un punto e virgola (;WTIH ), ma questo perché in genere le persone di sql-server (me compreso) non terminano le precedenti istruzioni che devono essere terminate prima che un CTE venga definito...

Nota, tuttavia, che hai avuto un secondo problema di sintassi per quanto riguarda il tuo WHERE dichiarazione. WHERE date IN table_2 non è valido perché non si fa mai effettivamente riferimento a un valore/colonna da table_2. Preferisco INNER JOIN su IN o Exists quindi ecco una sintassi che dovrebbe funzionare con un 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
;

Se vuoi mantenere il modo in cui lo avevi, che in genere EXISTS sarebbe meglio di IN, ma per usare IN hai bisogno di un'effettiva istruzione SELECT nel tuo dove.

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

IN è molto problematico quando date potrebbe essere potenzialmente NULL quindi se non vuoi usare un JOIN quindi suggerirei EXISTS . COME segue:

SELECT * 
FROM
     table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);