sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur använder man flera WITH-satser i en PostgreSQL-fråga?

Enligt de andra kommentarerna föregås det andra vanliga tabelluttrycket [CTE] av ett kommatecken inte ett WITH-uttryck så

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

När det gäller din faktiska fråga bör den här syntaxen fungera i PostgreSql, Oracle och sql-server, ju senare du vanligtvis fortsätter WITH med semikolon (;WTIH ), men det beror på att sql-serverfolk (inklusive mig själv) vanligtvis inte avslutar tidigare uttalanden som måste avslutas innan en CTE definieras...

Observera dock att du hade ett andra syntaxproblem när det gäller din WHERE påstående. WHERE date IN table_2 är inte giltig eftersom du aldrig faktiskt refererar till ett värde/kolumn från tabell_2. Jag föredrar INNER JOIN över IN eller Exists så här är en syntax som borde fungera 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
;

Om du vill behålla hur du hade det, vilket vanligtvis EXISTERAR skulle vara bättre än IN men för att använda IN behöver du en faktisk SELECT-sats i din var.

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

IN är mycket problematiskt när date kan potentiellt vara NULL så om du inte vill använda en JOIN då skulle jag föreslå EXISTS . SOM följer:

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


  1. Lägg till valutatecken £, $ i vissa fält ORACLE

  2. SQL Server-väntehändelser -3

  3. Batch Mode Bitmaps i SQL Server

  4. Oracle- Delad sträng kommaavgränsad (sträng innehåller mellanslag och på varandra följande kommatecken)