За іншими коментарями перед другим загальним виразом таблиці [CTE] передує кома, а не оператор WITH, тому
WITH cte1 AS (SELECT...)
, cte2 AS (SELECT...)
SELECT *
FROM
cte1 c1
INNER JOIN cte2 c2
ON ........
З точки зору вашого фактичного запиту, цей синтаксис повинен працювати в PostgreSql, Oracle та sql-сервері, а згодом, як правило, ви продовжите WITH
з крапкою з комою ( ;WTIH
), але це тому, що зазвичай люди sql-сервера (включаючи мене) не закінчуються попередні оператори, які потрібно закінчити до визначення КТЕ ...
Однак зауважте, що у вас була друга проблема із синтаксисом стосовно вашого 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
;
Якщо ви хочете зберегти те, що було у вас, яке зазвичай ІСНУЄ, було б краще, ніж IN, але для використання IN вам потрібен фактичний оператор SELECT у вашому де.
SELECT *
FROM
table_1 t1
WHERE t1.date IN (SELECT date FROM table_2);
IN дуже проблематично, коли date
це потенційно може бути, NULL
якщо ви не хочете використовувати a, JOIN
тоді я б запропонував EXISTS
. AS наступним чином:
SELECT *
FROM
table_1 t1
WHERE EXISTS (SELECT * FROM table_2 t2 WHERE t2.date = t1.date);
with
твердженням, будь-яким іншим після. Не впевнений щодо postgres, але це звичайний синтаксис із сервером Oracle та sql