Pouvons-nous avoir plusieurs "WITH AS" dans un seul SQL - Oracle SQL

102

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 faire cela, et utiliser "WITH AS". Cela semble être une simple exigence mais oracle ne me permet pas:

ORA-00928: mot clé SELECT manquant

user1933888
la source

Réponses:

190

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*/
Deepshikha
la source
2
Pouvons-nous utiliser un alias de la première sous-requête à la deuxième sous-requête? Dans ce cas, les sous-requêtes abcet xyz? J'ai besoin d'obtenir le résultat de la première sous-requête et de l'utiliser sur la deuxième sous-requête.
Cire le
@Wax Je suis capable d'utiliser les alias de la première sous-requête dans la deuxième sous-requête sans problème, tout comme la réponse ci-dessus le suggère. J'ai également pu utiliser des alias et des colonnes des deux tables dans la requête principale.
cleberz
Réponse parfaite.
InfiniteFlash
29

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;
Aditya Kakirde
la source
5
"vous pouvez également accéder aux colonnes de t1 ici" a été très utile de souligner.
Bren
10

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

SriniV
la source
3

Aditya ou autres, pouvez-vous rejoindre ou faire correspondre t2 avec t1 dans votre exemple, c'est-à-dire traduit dans mon 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 jonction ou quelle approche de jonction est prise en charge dans la 2ème entité WITH. Certains des exemples ont le WHERE A = B dans le corps de la sélection "sous" les clauses WITH.

L'erreur que j'obtiens en suivant ces déclarations WITH est que les identificateurs (noms de champ) en B ne sont pas reconnus, dans le corps du reste du SQL. La syntaxe WITH semble donc fonctionner correctement, mais ne peut pas accéder aux résultats de t2.

Dave
la source
Vous devez alia t1 dans la clause t2 with
Ben
Comment puis-je faire référence à la table de clauses dans la sous-requête? cela lance une erreur. par exemple, WITH SET1 AS (SELECT SYSDATE FROM DUAL), - SET1 initialisé SET2 AS (SELECT * FROM SET1) - SET1 a accédé à SELECT * FROM SET2 LEFT OUTER JOIN (select * from SET1 où sysdate = now ()) set3 on set1.sysdate = set3.sysdate;
Rupasa Sushma le