Подтвердить что ты не робот

Как использовать несколько операторов WITH в одном запросе PostgreSQL?

Я хотел бы "объявить", что эффективно несколько таблиц TEMP, используя оператор WITH. Запрос, который я пытаюсь выполнить, соответствует строкам:

WITH table_1 AS (
SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date
)

WITH table_2 AS (
SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date
)

SELECT * FROM table_1
WHERE date IN table_2

Я прочитал документацию PostgreSQL и исследовал использование нескольких операторов WITH и не смог найти ответ.

4b9b3361

Ответ 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);