Union pour remplacer un OUTER - SQL/NoSQL - Programmation
Marsh Posté le 10-06-2006 à 18:44:39
Désolé, la question n'est pas très claire. Je ne vois pas bien le but, et ce que vient faire cette table R2. A quoi correspond l'ID ? Apparemment, il y a moins d'ID dans la table R2 que dans la table R1, est-ce bien cela ?
L'UNION en SQL est souvent malcomprise. Elle n'a rien à voir avec une jointure. L'UNION ne fait qu'ajouter les lignes d'une requête aux ligne d'une autre requête. Mais peut-être ce n'est pas d'une UNION SQL dont il est question ici.
Oui, le (+) est l'équivalent d'un OUTER JOIN, et est même plus facile utiliser à mon humble avis.
Je ne connais pas d'équivalent de doxigen pour SQL, qui est déjà supposé être facile à lire.
Que veut dire "évalué à 1" ? Si cela veut dire le count renvoie 1 au lieu de zéro, cela me parait normal à cause de la laison externe. Pour avoir un count à zéro, il faut construire la requêtre autrement. Il faudrait un petit exemple avec quelques lignes de chaque table et quelques lignes du résultat attendu pour que le but à atteindre soit plus clair.
Marsh Posté le 10-06-2006 à 19:32:26
Tout d'abord, merci pour ta réponse
Voici le schéma des deux relations :
Code :
|
Pour chaque nuplet de R1, on doit compter le nombre de fois où R1.ID = R2.ID.
Voici un exemple :
Code :
|
Et le résultat que j'obtiens actuellement :
Code :
|
Et celui que je voudrais obtenir :
Code :
|
Merci pour ton aide
Marsh Posté le 11-06-2006 à 10:16:42
Une façon, entre autres, de le faire :
Code :
|
Marsh Posté le 11-06-2006 à 12:08:32
Merci pour ta proposition, mais je ne connais pas la fonction DECODE...
Avec l'union ça donnerait quoi ?
Marsh Posté le 11-06-2006 à 12:37:30
DECODE c'est une fonction Oracle qui fait :
DECODE(a, b1, c1, b2, c2, ..., d)
équivaut à :
si a = b1, alors renvoie c1,
si a = b2, alors renvoie c2,
...,
sinon renvoie d.
On peut le faire avec un CASE également :
CASE Y.ID IS NULL THEN 0 ELSE 1 END CASE
edit : avec UNION, on peut faire ça par exemple :
Code :
|
mais ça revient à faire une union + une jointure externe (car le NOT EXISTS c'est grosso modo une jointure externe).
Marsh Posté le 11-06-2006 à 13:27:42
Merci !
Néanmoins il y a une erreur dans la requête :
ERROR at line 6:
ORA-00904: "X"."PRENOMS": invalid identifier
Je modifie donc la ligne 7 comme suit :
FROM R1 X
Mais j'ai à présent une erreur sur la ligne du ORDER BY que je ne sait pas résoudre :
ERROR at line 10:
ORA-00904: "X"."PRENOMS": invalid identifier
Que faire ?
Marsh Posté le 11-06-2006 à 13:33:17
SELECT X.NOM, X.PRENOMS, COUNT(*) AS NB
FROM R1 X, R2 Y
WHERE Y.ID = X.ID
GROUP BY X.NOM, X.PRENOMS
UNION ALL
SELECT X.NOM, X.PRENOMS, 0 AS NB
FROM R1 X
WHERE NOT EXISTS
(SELECT 1 FROM R2 Y WHERE Y.ID = X.ID)
ORDER BY NB DESC, NOM, PRENOMS;
Cependant je ne sais plus si Oracle interprète correctement l'ORDER BY, ou s'il faut mettre le résultat de l'union dans une sous-requête pour que l'ORDER BY s'applique correctement ...
Mais c'est bien plus simple avec le DECODE
Marsh Posté le 11-06-2006 à 14:03:29
Ça fonctionne parfaitement !
Je me doute bien que le DECODE est plus efficace, mais je préfère utiliser l'UNION dans ce cas. Merci encore
Marsh Posté le 10-06-2006 à 15:32:32
Bonjour à tous,
J'ai la requête suivante :
qui devrait permettre de compter le nombre de jointures possibles entre les deux relations via l'attribut ID. Cependant les éléments ne possédant aucune jointure sont tout de même évalués à 1 au lieu de 0, il me faudrait donc effectuer une union équivalente à l'OUTER (étant sous Oracle 10g, le OUTER est représenté par (+)).
Or je n'ai aucune idée d'à quoi doit ressembler cette union. Quelqu'un pourrait-il m'éclairer ?
(PS : si la requête présentée si dessus est optimisable, vous pouvez me l'indiquer
(PPS : existe-t-il un système pour générer de la documentation comme Doxygen pour SQL ?)
Message édité par Ynnead le 10-06-2006 à 17:55:09