PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie verwende ich mehrere WITH-Anweisungen in einer PostgreSQL-Abfrage?

Gemäß den anderen Kommentaren wird dem zweiten Common Table Expression [CTE] ein Komma vorangestellt, keine WITH-Anweisung, also

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

In Bezug auf Ihre eigentliche Abfrage sollte diese Syntax in PostgreSql, Oracle und sql-server funktionieren, je nachdem, später werden Sie normalerweise mit WITH fortfahren mit einem Semikolon (;WTIH ), aber das liegt daran, dass normalerweise SQL-Server-Leute (mich eingeschlossen) vorherige Anweisungen nicht beenden, die beendet werden müssen, bevor ein CTE definiert wird ...

Beachten Sie jedoch, dass Sie ein zweites Syntaxproblem in Bezug auf Ihr WHERE hatten Erklärung. WHERE date IN table_2 ist nicht gültig, da Sie nie wirklich auf einen Wert/eine Spalte aus table_2 verweisen. Ich bevorzuge INNER JOIN über IN oder Exists Hier ist also eine Syntax, die mit einem JOIN funktionieren sollte :

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
;

Wenn Sie so bleiben wollen, wie Sie es hatten, wäre EXISTS normalerweise besser als IN, aber um IN zu verwenden, benötigen Sie eine tatsächliche SELECT-Anweisung in Ihrem Where.

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

IN ist sehr problematisch, wenn date könnte möglicherweise NULL sein wenn Sie also kein JOIN verwenden möchten dann würde ich EXISTS vorschlagen . WIE folgt:

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