sql >> Database >  >> RDS >> PostgreSQL

Hoe gebruik je meerdere WITH-statements in één PostgreSQL-query?

Volgens de andere opmerkingen wordt de tweede Common Table Expression [CTE] voorafgegaan door een komma en niet door een WITH-instructie, dus

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

In termen van uw werkelijke vraag zou deze syntaxis moeten werken in PostgreSql, Oracle en sql-server, en hoe later u gewoonlijk verder gaat WITH met een puntkomma (;WTIH ), maar dat komt omdat mensen met een sql-server (waaronder ikzelf) geen einde maken aan eerdere instructies die moeten worden beëindigd voordat een CTE wordt gedefinieerd...

Merk echter op dat u een tweede syntaxisprobleem had met betrekking tot uw WHERE uitspraak. WHERE date IN table_2 is niet geldig omdat u nooit echt verwijst naar een waarde/kolom uit tabel_2. Ik geef de voorkeur aan INNER JOIN meer dan IN of Exists dus hier is een syntaxis die zou moeten werken met een 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
;

Als je wilt houden zoals je het had, wat normaal gesproken EXISTS beter zou zijn dan IN, maar om IN te gebruiken, heb je een echte SELECT-instructie nodig in je waar.

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

IN is erg problematisch wanneer date kan mogelijk NULL zijn dus als je geen JOIN wilt gebruiken dan zou ik EXISTS aanraden . ALS volgt:

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


  1. Wat is het SYSNAME-gegevenstype in SQL Server?

  2. Wijzigingen opslaan na tabelbewerking in SQL Server Management Studio

  3. LOAD DATA LOCAL INFILE geeft de fout De gebruikte opdracht is niet toegestaan ​​met deze MySQL-versie

  4. VOEG WAARDEN IN WAAR NIET BESTAAT