Gemäß den anderen Kommentaren wird dem zweiten Common Table Expression [CTE] ein Komma vorangestellt, keine WITH-Anweisung, also
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 nachdem, später werden Sie normalerweise mit WITH
fortfahren mit einem Semikolon (;WTIH
), aber das liegt daran, dass normalerweise SQL-Server-Leute (mich eingeschlossen) vorherige Anweisungen nicht beenden, die beendet werden müssen, bevor ein CTE definiert wird ...
Beachten Sie jedoch, dass Sie ein zweites Syntaxproblem in Bezug auf Ihr WHERE
hatten Erklärung. WHERE date IN table_2
ist nicht gültig, da Sie nie wirklich auf einen Wert/eine Spalte aus table_2 verweisen. Ich bevorzuge INNER JOIN
über IN
oder Exists
Hier ist also eine Syntax, die mit einem JOIN
funktionieren sollte :
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 wollen, wie Sie es hatten, wäre EXISTS normalerweise besser als IN, aber um IN zu verwenden, 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
könnte möglicherweise NULL
sein wenn Sie also kein JOIN
verwenden möchten dann würde ich EXISTS
vorschlagen . WIE folgt:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);