Според другите коментари вторият общ израз на таблицата [CTE] се предхожда от запетая, а не от WITH израз, така че
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
По отношение на вашата действителна заявка този синтаксис трябва да работи в PostgreSql, Oracle и sql-server, а по-късно обикновено ще продължите WITH
с точка и запетая (;WTIH
), но това е така, защото обикновено хората на sql-сървър (включително и аз) не приключват предишни изрази, които трябва да бъдат приключени, преди да бъде дефиниран CTE...
Имайте предвид обаче, че имате втори проблем със синтаксиса по отношение на вашия WHERE
изявление. WHERE date IN table_2
не е валидно, защото всъщност никога не препращате към стойност/колона от table_2. Предпочитам INNER JOIN
през IN
или Exists
така че ето синтаксис, който трябва да работи с 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
;
Ако искате да запазите начина, по който сте го имали, което обикновено EXISTS би било по-добре от IN, но за да използвате IN, ви е необходим действителен оператор SELECT във вашето where.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN е много проблематичен, когато date
потенциално може да бъде NULL
така че ако не искате да използвате JOIN
тогава бих предложил EXISTS
. както следва:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);