Я хотел бы «объявить», что фактически является несколькими таблицами 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
операторов, но не смог найти ответа.
with
утверждением, после любого другого. Не уверен насчет postgres, но это нормальный синтаксис с Oracle и sql serverERROR: syntax error at or near "WITH"
для запятой иERROR: syntax error at or near ";"
для точки с запятой.Ответы:
В соответствии с другими комментариями второму выражению общей таблицы [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. Например:
WITH tab1 as (Your SQL statement), tab2 as ( SELECT ... FROM tab1 WHERE your filter), tab3 as ( SELECT ... FROM tab2 WHERE your filter) SELECT * FROM tab3;
источник