comment éviter les doublons sur la jointure de deux tables
Student Table
SID Name
1 A
2 B
3 C
Marks Table
id mark subject
1 50 physics
2 40 biology
1 50 chemistry
3 30 mathematics
SELECT distinct(std.id),std.name,m.mark, row_number() over() as rownum FROM
student std JOIN marks m ON std.id=m.id AND m.mark=50
Ce résultat est 2 fois Une même après l'utilisation de disticnt . Mon résultat attendu n'aura qu'un seul A. si je supprime la fonction row_number() over() rownum son travail très bien. Pourquoi ce qui se passe ? comment résoudre. SUIS de l'utilisation de DB2!!
Quel est le point de rejoindre Étudiants et les Marques si vous ne voulez pas de repères, à la fois physique et de la chimie?
je veux juste l'étudiant qui a obtenu 50 dans atleast un sujet
je veux juste l'étudiant qui a obtenu 50 dans atleast un sujet
OriginalL'auteur zod | 2011-11-11
Vous devez vous connecter pour publier un commentaire.
Il y a deux lignes dans des marques de Table avec l'id = 1 et mark = 50.. vous aurez Donc deux lignes dans le résultat de chaque ligne dans la table des étudiants...
Si vous n'en voulez un, vous avez à faire à un groupe Par
TOUJOURS mettre les prédicats de jointure dans la jointure. La clause where les prédicats ne sont pas évaluées jusqu'à ce que après l'ensemble du jeu de résultats a été générée, donc inutiles lignes sont menées tout au long du traitement, et dans certains jointure externe scénarios, de mettre des prédicats dans la clause where sera de générer des résultats incorrects. Enfin, prendre des prédicats de jointure dans la jointure met près de la tables qu'ils sont, plutôt, tous ensemble, à la fin, ce qui ajoute de la clarté à la requête.
AUSSI, parfois, vous voulez vous joindre à la même table plusieurs fois, avec DIFFÉRENTS prédicats pour chaque jointure. Comment allez-vous faire que dans une clause where?
Tous les grands de base de données relationnelle est assez intelligent pour mettre les conditions de filtrage avant
JOIN
conditions alors qu'en réalité, l'évaluation de la requête; ils sont tout bon à réduire le nombre d'opérations qu'ils ont à effectuer (aka l'optimisation). En règle générale, si vous mettez quelque chose commem.mark = 50
dans leWHERE
ou laON
clause n'a même pas d'incidence sur le plan de requête. En tant que tel, l'esthétique, l'amélioration est la seule vraie considération (pour les jointures internes, au moins), et de mettre de telles conditions dans leWHERE
clause est beaucoup plus intuitive.NON, ils ne le sont pas, car les résultats de la mise au prédicat dans chacun de ces deux endroits est (ou peut être) DIFFÉRENT, et l'optimiseur ne peut pas être conçu à lire l'esprit de la requête de l'auteur. Dans un cas, le prédicat est évalué avant de la rejoindre, et dans l'autre cas, elle est évaluée après le rejoindre.
OriginalL'auteur Charles Bretana
Maintenant que vous avez précisé votre question:
Je veux trouver tous les étudiants avec une note de 50 à au moins un sujet. Je voudrais utiliser la requête:
Cela vous donne également la flexibilité pour modifier les critères, par exemple, au moins une marque de 50 ou moins.
+1 pour l'utilisation de OÙ EXISTE, mais vous avez oublié son numéro de rangée de la colonne.
Je ne comprends vraiment pas ce que l'OP est en train de faire avec
row_number() over ()
. @zod peut-être vous pouvez préciser?row_number() over () est utilisé pour la pagination , tout comme LIMITE dans mysql
À lire sur
row_number() over ()
il fournit simplement un séquentielle numéro de ligne pour chaque ligne de résultat, de sorte qu'il pourrait certainement ont été inclus. Le DE et OÙ sont les aspects importants de la solution, mais merci pour le coup de coude de m'apprendre quelque chose de nouveau.OriginalL'auteur sceaj
Similaire à Charles de réponse, mais vous voulez toujours mettre le prédicat (marque=50) dans la clause where, si vous êtes de filtrage avant de les rejoindre. Si c'est juste les devoirs, il ne pourrait pas la matière, mais vous aurez envie de se souvenir de cette si jamais vous appuyez sur l'une des données réelles.
Pas - DB2 (au moins sur l'iSeries) semble produire les mêmes plans d'explication, et semble considérer les deux requêtes comme équivalent (en utilisant les mêmes chemins d'accès); au moins pour des exemples aussi simples que cela. @Tous - mettre une condition dans la
WHERE
de la clause par rapport à laJOIN
clause pas retourne toujours le même résultat (c'est particulièrement le cas lors de l'utilisation deLEFT
et/ouEXCEPTION
joint), de sorte que les conditions doivent être placés là où ils génèrent des résultats corrects, pas pour des raisons de performances DB2 optimizer est assez bonne, trop).Je suis familier avec elle dans Oracle. Parfois, il figure it out, mais parfois, il les chiffres que tu veux réellement dire ce que vous dites avec le SQL, et des vents jusqu'à prendre une éternité.
OriginalL'auteur orbfish