Можем ли мы иметь несколько «WITH AS» в одном sql - Oracle SQL

102

У меня был очень простой вопрос: разрешает ли oracle несколько "WITH AS" в одном операторе sql.

Пример:

WITH abc AS( select ......)

WITH XYZ AS(select ....) /*This one uses "abc" multiple times*/

Select ....   /*using XYZ multiple times*/

Я могу заставить запрос работать, повторяя один и тот же запрос несколько раз, но я не хочу этого делать и использую «С КАК». Это кажется простым требованием, но Oracle не позволяет мне:

ORA-00928: отсутствует ключевое слово SELECT

user1933888
источник

Ответы:

192

Вы можете сделать это как:

WITH abc AS( select
             FROM ...)
, XYZ AS(select
         From abc ....) /*This one uses "abc" multiple times*/
  Select 
  From XYZ....   /*using abc, XYZ multiple times*/
Дипшиха
источник
2
Можем ли мы использовать псевдоним от первого подзапроса ко второму подзапросу? В этом случае abcи xyzподзапросов? Мне нужно получить результат первого подзапроса и использовать его во втором подзапросе.
Воск
@Wax Я могу использовать псевдонимы из первого подзапроса во втором подзапросе без проблем, как и предполагает ответ выше. Я также смог использовать псевдонимы и столбцы из обеих таблиц в основном запросе.
cleberz
Прекрасный ответ.
InfiniteFlash
29

правильный синтаксис -

with t1
as
(select * from tab1
where conditions...
),
t2
as
(select * from tab2
where conditions...
(you can access columns of t1 here as well)
)
select * from t1, t2
where t1.col1=t2.col2;
Адитья Какирде
источник
5
«Вы также можете получить доступ к столбцам t1 здесь», было очень полезно указать.
Брен
10

Да, ты можешь...

WITH SET1 AS (SELECT SYSDATE FROM DUAL), -- SET1 initialised
     SET2 AS (SELECT * FROM SET1)        -- SET1 accessed
SELECT * FROM SET2;                      -- SET2 projected

10/29/2013 10:43:26 AM

Следуйте порядку, в котором он должен быть инициализирован в Common Table Expressions

SriniV
источник
3

Адитья или другие, можете ли вы присоединиться или сопоставить t2 с t1 в вашем примере, то есть переведенным на мой код,

with t1 as (select * from AA where FIRSTNAME like 'Kermit'),
     t2 as (select * from BB B join t1 on t1.FIELD1 = B.FIELD1)

Мне неясно, поддерживается ли для присоединения только WHERE или какой подход к присоединению поддерживается во втором объекте WITH. В некоторых примерах WHERE A = B находится внизу в теле выбора "под" предложениями WITH.

Ошибка, которую я получаю после этих объявлений WITH, заключается в том, что идентификаторы (имена полей) в B не распознаются в теле остальной части SQL. Таким образом, синтаксис WITH, похоже, работает нормально, но не может получить доступ к результатам из t2.

Дэйв
источник
Вам нужно указать t1 в пределах t2 с помощью пункта
Бен
Как я могу ссылаться на таблицу предложений внутри подзапроса? это выдает ошибку. например, WITH SET1 AS (SELECT SYSDATE FROM DUAL), - SET1 инициализирован SET2 AS (SELECT * FROM SET1) - SET1 получил доступ к SELECT * FROM SET2 LEFT OUTER JOIN (выберите * из SET1, где sysdate = now ()) set3 on set1.sysdate = set3.sysdate;
Рупаса Сушма