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 es INNER JOIN
über IN
oder Exists
so ist hier eine Syntax , die mit einem funktionieren sollte 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
;
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 Fall NULL
sein könnte. Wenn Sie kein verwenden möchten, JOIN
würde ich vorschlagen EXISTS
. Wie folgt:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
Anweisung und alle anderen danach. Ich bin mir nicht sicher über Postgres, aber das ist die normale Syntax mit Oracle und SQL Server