Envoyé par
CinePhil
Ne manquerait-il pas un alias Z dans le premier SELECT pour qu'il puisse figurer dans le deuxième ?
Dans le 1er SELECT ne figure que la variable R dont l’en-tête n’a pour éléments que les attributs Prisme1Id et Prisme2Id. Certes, on pourrait y remplacer :
SELECT Prisme1Id, Prisme2Id, Prisme1Id
Par
SELECT Prisme1Id, Prisme2Id, Prisme1Id AS Z
Mais l’analyseur syntaxique s’en ficherait comme de l’an quarante : seul lui importe que les attributs de l’en-tête de chacun des deux SELECT soient du même type, ce qui est bien le cas, puisque justement Z hérite du type de Prisme1Id. Par contre, si SQL suivait les contraintes syntaxiques du Modèle Relationnel de Données (langages orientés D), on aurait un problème car les opérations ensemblistes telles que l’union exigent que le ième attribut de chaque en-tête ait le même nom (d’où l’importance en D de l’opérateur RENAME).
Envoyé par
CinePhil
j'ai un peu de mal avec cette vue
Je vais essayer de suivre la recommandation de Nicolas Boileau tout en espérant respecter celle de Ludwig Wittgenstein (« Sur ce dont on ne peut parler, il faut garder le silence »).
Reprenons la requête récursive :
1 2 3 4 5 6 7 8 9 10 11 12
| WITH W (X, Y, Z) AS
(
SELECT Prisme1Id, Prisme2Id, Prisme1Id
FROM R
WHERE BoolenActif = 0
UNION ALL
SELECT Prisme1Id, Prisme2Id, Z
FROM R JOIN W ON Prisme1Id = Y
WHERE BoolenActif = 0
)
SELECT *
FROM W ; |
Et supposons que la valeur de la table R soit la suivante :
1 2 3
| R (Prisme1Id Prisme2Id)
A B
B C |
Le 1er SELECT (sous-requête initiale, initial subquery) a pour objet d’amorcer la pompe en alimentant la table temporaire W avec les lignes de R qui satisfont la condition figurant dans la clause WHERE. Au résultat :
Une fois la pompe amorcée, c’est parti plein pot pour la partie récursive.
Le 2e SELECT (sous-requête récursive, recursive subquery) a pour objet d’enrichir W avec chaque ligne de R qui satisfait la condition :
R.Prisme1 = W.Y
Commençons avec la 1re ligne de W : <'A', 'B', 'A'>. Pour celle-ci W.Y = 'B' :
Concernant la 1re ligne de R, comme W.Y = 'B' et R.Prisme1 = 'A', la condition n’est pas satisfaite, cette ligne de R n’est donc pas ajoutée à W.
Concernant la 2e ligne de R, comme W.Y = 'B' et R.Prisme1 = 'B', la condition est satisfaite, cette ligne de R (enrichie de W.Z = 'A') est ajoutée à W qui prend la valeur :
1 2 3 4
| W (X Y Z)
A B A
B C B
B C A |
Poursuivons avec la 2e ligne de W :
W.Y = 'C', mais R ne satisfait pas la condition R.Prisme1 = W.Y, à savoir R.Prisme1 = 'C' : W ne change donc pas.
Etc.
Une fois le traitement récursif terminé, on peut exploiter le contenu final de W à l’aide du SELECT final (lignes 11 et 12).
A cette occasion, je vous invite à revoir la discussion sur les arbres entremêlés, avec le professionnel qui n’a pas de temps à perdre...
Envoyé par
CinePhil
l'élève ne dépasse pas encore le maître !
Comme le faisait observer en rigolant Usain Bolt à Nelson Montfort qui demandait à Christophe Lemaître s’il se voyait sur la plus haute marche du podium alors que celui-ci venait d’hériter d’un des pires couloirs pour la finale du 200 mètres à Londres : « Il faudra qu’il améliore son virage ! » Et Bolt n'avait pas tort, le Christophe ne fut même pas sur le podium...
Partager