Requête externe sur résultat de requête externe - SQL/NoSQL - Programmation
Marsh Posté le 16-09-2008 à 17:29:10
pourquoi tu fais une jointure ouverte ? (parceque pour le résultat que tu veux, tu n'en a pas besoin)
et si tu as une version >= 9i, alors écrit ta requête avec la syntaxe SQL92, à savoir en utilisant les jointures de type "right outer join", qui est à la fois plus explicite pour toi et pour oracle. si je comprends bien éventuellement ton problème, je pense d'ailleurs que la réponse se trouve dans cette syntaxe. la jointure entre b et c est un inner join et non un outer join
Marsh Posté le 16-09-2008 à 19:08:42
MagicBuzz a écrit : pourquoi tu fais une jointure ouverte ? (parceque pour le résultat que tu veux, tu n'en a pas besoin) |
Merci de ta réponse MagicBuzz.
Je travaille en 10g. J'y ai pensé, et tenté de remplacer la jointure externe par une jointure interne entre B et C (AND b.NUM = c.NUM), mais à ce moment je n'ai plus aucun résultat! Et cela équivaut, sauf erreur de ma part, à un inner join non? Je ne suis pas très familiarisé avec l'écriture ANSI mais je vais approfondir en tout cas. Merci de la suggestion.
Marsh Posté le 17-09-2008 à 00:42:57
ben tout dépend. déjà, est-ce que tu as forcément des tupes dans chacune des trois tables, ou si lorsqu'une valeur n'est présente que dans A, tu peux quand même l'afficher en disant qu'il n'y a rien dans C ?
Marsh Posté le 17-09-2008 à 00:55:13
Exemple de ce que j'ai compris à 1h du matin
Sous SQL Server 2008. Mise à part les "go", les types et les [] d'échappement, la syntaxe devrait être rigoureusement la même.
Code :
|
Sortie :
|
Marsh Posté le 17-09-2008 à 01:04:00
Donc pour moi c'est bêtement du inner join.
Si par contre, dans le cas où il n'y a pas d'entrée val = 8 pour id = 2, tu n'auras pas de ligne. Si tu veux une ligne avec id = 2 et val = null en sortie, alors c'est plus sioux :
Code :
|
(Ca doit pouvoir s'écrire autrement)
|
(premier coup avec la ligne existante dans C et second coup avec la ligne non existante dans C)
Le "MIN" c'est pour s'assurer qu'en cas de doublons dans VAL (deux lignes avec val = 8 pour des num différents rattachés au même id) la requête ne plante pas. Tu n'auras par contre qu'une seule ligne dans ce cas. Si tu veux avoir deux lignes, il faut déplacer la jointure de la sous-requête à la requête principale :
Code :
|
|
Marsh Posté le 17-09-2008 à 15:46:18
Ok, j'ai peut-être trop simplifié mon problème, je vais essayer d'être plus clair.
Voici ma requête réécrite, version ANSI, selon tes conseils:
|
Explication:
Chaque ligne de A contient (ou non) une entrée dans la table B.
Chaque ligne de la table B pointe sur la table C
Certaines lignes de la table C sont du type qui m'intéresse (8 et 9, soit deux types, d'où la nécessité selon moi d'avoir a1 ET a2, c1 ET c2).
Je veux, pour l'entrée de A ayant id=2, une seule ligne en résultat, et qui contient:
|
Mais avec la requête ci-dessus, je ne récupère aucun résultat...
Marsh Posté le 17-09-2008 à 16:20:56
Entre C1 et C2, la seule chose qui change c'est le contenu de la colonne "num", n'est ce pas, et tu n'as pas besoin qu'une ligne de A corresponde aux deux types de C recherché.
Dans ce cas pourquoi ne pas simplifier en ne gardant qu'une seule instance de la table C et en utilisant un "OR"?
Ca donnerait quelque chose du genre :
Citation : SELECT A.id, C.val |
Marsh Posté le 17-09-2008 à 16:59:10
Salut Omega2 et merci.
Je suppose que la requête que tu proposais était:
Code :
|
laquelle me ramène deux lignes:
|
mais je ne veux qu'une seule ligne par id:
|
Je continue à chercher merci de vos lumières!
omega2 a écrit : Entre C1 et C2, la seule chose qui change c'est le contenu de la colonne "num", n'est ce pas, et tu n'as pas besoin qu'une ligne de A corresponde aux deux types de C recherché.
|
Marsh Posté le 17-09-2008 à 17:14:22
oups, oui : c1
Regarde la syntaxe pour faire des requêtes imbriqués telles que dans le dernier exemple de MagicBuzz. En utilisant cette méthode et en faisant une requête par "cX.num" tu peux obtenir le résultat que tu veux.
Marsh Posté le 18-09-2008 à 13:48:24
si tu as un nombre indéterminé de val que tu souhaites avoir sur la même ligne -> PL/SQL
Marsh Posté le 16-09-2008 à 17:26:35
Salut à tous,
Je fais face (courageusement) au problème de construction de requête suivant. Je n'ai rien trouvé sur le faux-rhum qui pourrait m'aiguiller alors toute aide à ce sujet sera appréciée à sa juste valeur!
J'ai 3 tables A, B, C:
A contient des identifiants, C des données, B est une table d'association de A vers C.
J'ai donc une structure qui ressemble à:
A
ID=1
ID=2
ID=3
B
ID=1 NUM=4
ID=2 NUM=5
ID=2 NUM=6
ID=3 NUM=4
C
NUM=4 VAL=7
NUM=5 VAL=8
Mon but est de récupérer les données VAL de C relatives au ID 2 de A qui ont un C.VAL=8 (!)
Je voudrais donc récupérer cette unique ligne:
ID VAL
2 8
J'écris donc quelque chose comme ça (je veux éviter autant que possible l'utilisation de sous-requêtes pour des raisons de perfs):
Pourtant, je récupère 4 résultats, soit 2^2 lignes.
Je comprends qu'Oracle effectue la 2nde jointure externe sans tenir compte du résultat de la 3e... mais comment faire autrement?