В соответствии с другими комментариями второму выражению общей таблицы [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-server (включая меня) не заканчиваются предыдущие операторы, которые необходимо завершить до определения CTE ...
Однако обратите внимание, что у вас возникла вторая проблема с синтаксисом в отношении вашего WHERE
утверждения. WHERE date IN table_2
недействителен, потому что вы никогда не ссылаетесь на значение / столбец из таблицы_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
так, если вы не хотите использовать a, JOIN
я бы предложил EXISTS
. Следующим образом:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
утверждением, после любого другого. Не уверен насчет postgres, но это нормальный синтаксис с Oracle и sql server