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

Hvordan bruger man flere WITH-sætninger i en PostgreSQL-forespørgsel?

Ifølge de andre kommentarer er det andet almindelige tabeludtryk [CTE] indledt af et komma og ikke en WITH-sætning, så

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

Med hensyn til din faktiske forespørgsel burde denne syntaks fungere i PostgreSql, Oracle og sql-server, jo senere vil du typisk fortsætte WITH med semikolon (;WTIH ), men det er fordi typisk sql-server folk (inklusive mig selv) ikke afslutter tidligere udsagn, som skal afsluttes, før en CTE defineres...

Bemærk dog, at du havde et andet syntaksproblem med hensyn til din WHERE udmelding. WHERE date IN table_2 er ikke gyldig, fordi du aldrig faktisk refererer til en værdi/kolonne fra tabel_2. Jeg foretrækker INNER JOIN over IN eller Exists så her er en syntaks, der burde fungere med en 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
;

Hvis du vil beholde den måde, du havde det på, som typisk EKSISTERER, ville være bedre end IN, men for at bruge IN skal du bruge en egentlig SELECT-erklæring i dit hvor.

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

IN er meget problematisk, når date kunne potentielt være NULL så hvis du ikke ønsker at bruge en JOIN så vil jeg foreslå EXISTS . SOM følger:

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


  1. SQLite Node.js

  2. Bruger du Excel til din database? Her er hvorfor du bør opgradere til Access

  3. Konvertering af cifre/tal i ord til INR-valuta (indiske rupier) i Oracle PL/SQL

  4. Hibernate kunne ikke hente SequenceInformation fra databasen