Чи можемо ми мати кілька “З ЯК” в одному sql - Oracle SQL


102

У мене було дуже просте запитання: чи дозволяє Oracle дозволити кілька "З ЯК" в одному операторі sql.

Приклад:

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

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

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

Я можу змусити запит працювати, повторюючи один і той самий запит кілька разів, але не хочу цього робити і використовувати "З ЯК". Це здається простою вимогою, але Oracle не дозволяє мені:

ORA-00928: відсутнє ключове слово SELECT

Відповіді:


190

Це можна зробити так:

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

Дотримуйтесь порядку, в якому його слід ініціалізувати у загальних виразах таблиць


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, або який підхід приєднання підтримується в рамках суті 2nd WITH. Деякі з прикладів містять WHERE A = B в тілі пункту вибору "нижче" "З".

Помилка, яку я отримую після цих оголошень WITH, - це те, що ідентифікатори (імена полів) у B не розпізнаються, в тілі решти SQL. Таким чином, синтаксис ЗО, здається, працює добре, але не може отримати доступ до результатів з t2.


Вам потрібно встановити псевдонім t1 в межах t2 з пунктом
Бен

Як я можу посилатися на таблицю пропозицій всередині підзапиту? це кидання помилки. наприклад, З SET1 AS (ВИБІР СИСАДУ ДУАЛЬНОГО), - SET1 ініціалізований SET2 AS (ВИБІР * ВІД SET1) - SET1 доступний ВИБІР * ВІД SET2 ВІД ВІДПРИЄМАТИ (виберіть * з SET1, де sysdate = зараз ()) set3 on set1.sysdate = set3.sysdate;
Рупаса Сушма
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.