Ich möchte mit der WITH-Anweisung "deklarieren", was effektiv mehrere TEMP-Tabellen sind. Die Abfrage, die ich ausführen möchte, lautet wie folgt:
WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)
WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)
SELECT * FROM table_1
WHERE date IN table_2
Ich habe die PostgreSQL-Dokumentation gelesen und nach der Verwendung mehrerer WITH
Anweisungen gesucht und konnte keine Antwort finden.
with
Anweisung und alle anderen danach. Ich bin mir nicht sicher über Postgres, aber das ist die normale Syntax mit Oracle und SQL ServerERROR: syntax error at or near "WITH"
für das Komma undERROR: syntax error at or near ";"
für das Semikolon.Antworten:
Gemäß den anderen Kommentaren steht vor dem zweiten Common Table Expression [CTE] ein Komma und keine WITH-Anweisung
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 später Sie normalerweise
WITH
mit einem Semikolon (;WTIH
) fortfahren , dies liegt daran, dass SQL-Server-Leute (ich selbst eingeschlossen) normalerweise nicht enden frühere Aussagen, die beendet werden müssen, bevor ein CTE definiert wird ...Beachten Sie jedoch, dass Sie in Bezug auf Ihre
WHERE
Anweisung ein zweites Syntaxproblem hatten .WHERE date IN table_2
ist ungültig, da Sie niemals auf einen Wert / eine Spalte aus Tabelle_2 verweisen. Ich ziehe esINNER JOIN
überIN
oderExists
so ist hier eine Syntax , die mit einem funktionieren sollteJOIN
: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 möchten, wie Sie es hatten, was normalerweise EXISTS besser ist als IN, aber um IN verwenden zu können, 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
dies möglicherweise der FallNULL
sein könnte. Wenn Sie kein verwenden möchten,JOIN
würde ich vorschlagenEXISTS
. Wie folgt:SELECT * FROM table_1 t1 WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
quelle
Sie können Ihre Ergebnisse auch mit der WITH-Anweisung verketten. Z.B:
WITH tab1 as (Your SQL statement), tab2 as ( SELECT ... FROM tab1 WHERE your filter), tab3 as ( SELECT ... FROM tab2 WHERE your filter) SELECT * FROM tab3;
quelle