Ответ 1
По другим комментариям второе выражение Common Table [CTE] предшествует запятой, а не оператором WITH, поэтому
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1.....
В терминах вашего фактического запроса этот синтаксис должен работать в PostgreSql, Oracle и sql-сервере, ну, как правило, позже вы будете продолжать WITH
с точкой с запятой, но это потому, что обычно sql-server folkes (включая меня) 't заканчивать предыдущие утверждения, которые должны быть завершены до определения 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 в вашем месте.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN очень проблематично, если date
потенциально может быть NULL
, поэтому, если вы не хотите использовать JOIN
, я бы предложил, что существует. AS следует:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);