Comment puis-je supprimer les “doublons” les lignes de vue?
J'ai un point de vue qui marchait très bien quand je suis entrée dans ma table principale:
LEFT OUTER JOIN OFFICE ON CLIENT.CASE_OFFICE = OFFICE.TABLE_CODE.
Cependant j'ai besoin d'ajouter la jointure suivante:
LEFT OUTER JOIN OFFICE_MIS ON CLIENT.REFERRAL_OFFICE = OFFICE_MIS.TABLE_CODE
Bien que j'ai ajouté DISTINCT
, je reçois toujours un "double" de ligne. Je dis "en double", parce que la deuxième ligne a une valeur différente.
Cependant, si je change le LEFT OUTER
à un INNER JOIN
, je perds toutes les lignes pour les clients qui ont ces "doublons" des lignes.
Ce que je fais mal? Comment puis-je supprimer ces "doublons" lignes de mon point de vue?
Remarque:
Cette question n'est pas applicable dans ce cas:
Auriez-vous l'esprit nettoyage de votre question et à l'aide de blocs de code avec plus explicites?
OriginalL'auteur Fet | 2009-07-10
Vous devez vous connecter pour publier un commentaire.
DISTINCTES ne vous aidera pas si les lignes ont toutes les colonnes qui sont différents. De toute évidence, l'une des tables que vous vous joignez à plusieurs lignes pour une seule ligne dans une autre table. Pour obtenir une ligne de retour, vous devez éliminer les autres plusieurs lignes dans la table que vous vous joignez à.
La meilleure façon de le faire est d'améliorer votre clause where ou restriction de JOINTURE à seulement adhérer à l'enregistrement que vous souhaitez. Habituellement, cela nécessite la détermination d'une règle qui vous permettra de toujours sélectionner les "bons" entrée de l'autre table.
Supposons que vous avez un problème simple comme ceci:
Si vous créez un simple joignez-vous ici, vous recevrez deux enregistrements pour Jane:
C'est tout à fait correct si le point de votre point de vue est à la liste de toutes les combinaisons des personnes et des animaux domestiques. Toutefois, si votre point de vue était plutôt censé la liste des personnes avec des animaux, ou la liste des personnes et de l'affichage de l'un de leurs animaux de compagnie, vous avez touché le problème que vous avez maintenant. Pour cela, vous avez besoin d'une règle.
Ce que cela fait, c'est d'appliquer une règle de restreindre les Animaux de compagnie enregistrement dans la jointure de l'Animal de compagnie avec le plus petit ID (d'abord dans les Animaux de compagnie de la table). La clause where dit essentiellement: "où il n'y a pas d'animaux appartenant à la même personne avec une baisse de la valeur de l'ID).
Cela donnerait un résultat record:
La règle que vous aurez besoin d'appliquer votre point de vue dépendra de données dans les colonnes que vous possédez, et de la présence de multiples dossiers doivent être affichées dans la colonne. Cependant, qui sera le vent en cachant des données, ce qui peut ne pas être ce que vous voulez. Par exemple, la règle ci-dessus masque le fait que Jane a un Chien. Il le fait apparaître comme si Jane n'a qu'un Chat, quand ce n'est pas correct.
Vous devrez peut-être repenser le contenu de votre point de vue, et de ce que vous essayez d'accomplir avec votre point de vue, si vous êtes de départ pour filtrer des données valides.
c'est une façon intéressante de le faire. Est que plus rapide que le select top 1 de la sous-requête dans ma réponse?
Je ne suis pas sûr si c'est plus rapide que de le sélectionner en haut, mais je voulais montrer un exemple générique de l'application d'une règle. Le select ci-dessus peut également avoir une toute autre clause where, ou peut-être une restriction à la JOINTURE de dire "où les Animaux de compagnie.Nom = 'Cat'". Le concept est qu'une règle est nécessaire, et il doit être spécifique à la vue en cours d'élaboration et le contexte des données qui doit être présenté.
OriginalL'auteur Jay S
Si le secondd ligne a une valeur différente qu'elle ne l'est pas vraiment en double et doivent être inclus.
OriginalL'auteur Hunter
Si vous avez ajouté une jointure externe gauche qui est de l'appariement de deux lignes? OFFICE_MIS.TABLE_CODE n'est pas unique dans la table, je suppose? vous devez limiter les que se joindre à seulement saisir une seule ligne. Cela dépend de la ligne que vous cherchez, mais vous pouvez faire quelque chose comme ça...
OriginalL'auteur dotjoe
Au lieu d'utiliser
DISTINCT
, vous pouvez utiliser unGROUP BY
.MIN
/MAX
/AVG
ou toute autre fonction pour vous donner un résultat pour les champs qui pourrait renvoyer plusieurs valeurs.Exemple:
OriginalL'auteur Lieven Keersmaekers
Vous pouvez essayer d'utiliser Haut Distinct, 1 mais en tant que Chasseur l'a souligné, si il n'y a qu'une seule colonne est différente, alors il devrait être inclus ou si vous ne se soucient pas ou ont besoin de la colonne que vous devriez le supprimer. Toute autre suggestion serait probablement besoin d'informations plus spécifiques.
EDIT: Lors de l'utilisation de Haut Distinct, 1 vous avez besoin d'avoir une groupe par déclaration. Vous voulez vraiment être à l'aide de la Top 1 partie. Le Distinct est là parce que si il y a égalité pour Top 1 vous recevrez un message d'erreur sans avoir une façon d'éviter une cravate. Les deux façons les plus courantes que j'ai vu l'ajout d' Distinctes à Top 1 ou vous pouvez ajouter une colonne à la requête qui est unique, de sorte que sql serait un moyen de choisir les enregistrements à chercher dans ce qui serait autrement une cravate.
Merci beaucoup Riche B. je vais utiliser votre suggestion.
Merci Bryan. Je vais appliquer à votre suggestion.
Votre solution a fonctionné très bien pour moi jusqu'à présent. Je ne pouvais pas changer la requête complètement le contraire, ce qui implique une JOINTURE entre 5 tables et une UNION entre 3 requêtes. Merci.
OriginalL'auteur Bryan