web-dev-qa-db-fra.com

Peut-on avoir plusieurs "WITH AS" dans un seul sql - Oracle SQL

J'avais une question très simple: Oracle autorise-t-il plusieurs "WITH AS" dans une seule instruction SQL?.

Exemple:

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

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

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

Je peux faire fonctionner la requête en répétant la même requête plusieurs fois, mais je ne veux pas le faire, et utiliser "WITH AS". Cela semble être une simple exigence mais Oracle ne me permet pas:

ORA-00928: mot clé SELECT manquant

83
user1933888

Vous pouvez le faire comme:

WITH abc AS( select
             FROM ...)
, XYZ AS(select
         From abc ....) /*This one uses "abc" multiple times*/
  Select 
  From XYZ....   /*using abc, XYZ multiple times*/
145
Deepshikha

la syntaxe correcte est -

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;
23
Aditya Kakirde

Oui, vous pouvez...

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

Suivez l'ordre dans lequel il doit être initialisé dans les expressions de table communes

9
SriniV

Aditya ou d’autres, pouvez-vous joindre ou faire correspondre t2 avec t1 dans votre exemple, c’est-à-dire traduit en code,

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

Je ne sais pas si seul WHERE est pris en charge pour la jointure ou quelle approche de jointure est prise en charge dans la 2ème entité WITH. Certains exemples ont le WHERE A = B dans le corps de la sélection "en dessous" des clauses WITH.

L'erreur que je reçois en suivant ces déclarations WITH est que les identifiants (noms de champs) dans B ne sont pas reconnus, en bas dans le corps du reste du code SQL. Donc, la syntaxe WITH semble fonctionner correctement, mais ne peut pas accéder aux résultats de t2.

3
Dave