Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment supprimer les lignes en double d'une vue ?

DISTINCT ne vous aidera pas si les lignes ont des colonnes différentes. De toute évidence, l'une des tables auxquelles vous vous joignez comporte plusieurs lignes pour une seule ligne dans une autre table. Pour récupérer une ligne, vous devez éliminer les autres lignes multiples de la table à laquelle vous vous joignez.

Pour ce faire, le moyen le plus simple consiste à améliorer votre clause where ou votre restriction JOIN pour ne joindre qu'à l'enregistrement unique que vous souhaitez. Cela nécessite généralement de déterminer une règle qui sélectionnera toujours l'entrée "correcte" dans l'autre table.

Supposons que vous ayez un problème simple comme celui-ci :

Person:  Jane
Pets: Cat, Dog

Si vous créez une jointure simple ici, vous recevrez deux enregistrements pour Jane :

Jane|Cat
Jane|Dog

C'est tout à fait correct si votre point de vue est d'énumérer toutes les combinaisons de personnes et d'animaux domestiques. Cependant, si votre vue était plutôt censée répertorier les personnes avec des animaux de compagnie, ou répertorier les personnes et afficher l'un de leurs animaux de compagnie, vous rencontrez le problème que vous avez maintenant. Pour cela, vous avez besoin d'une règle.

SELECT Person.Name, Pets.Name
FROM Person
  LEFT JOIN Pets pets1 ON pets1.PersonID = Person.ID
WHERE 0 = (SELECT COUNT(pets2.ID) 
             FROM Pets pets2
             WHERE pets2.PersonID = pets1.PersonID
                AND pets2.ID < pets1.ID);

Cela applique une règle pour limiter l'enregistrement Pets dans la jointure à l'animal avec l'ID le plus bas (le premier dans la table Pets). La clause WHERE dit essentiellement "lorsqu'il n'y a pas d'animaux appartenant à la même personne avec une valeur d'identification inférieure).

Cela donnerait un résultat d'un enregistrement :

Jane|Cat

La règle que vous devrez appliquer à votre vue dépendra des données dans les colonnes dont vous disposez et des enregistrements "multiples" qui doivent être affichés dans la colonne. Cependant, cela finira par masquer certaines données, ce qui peut ne pas être ce que vous voulez. Par exemple, la règle ci-dessus cache le fait que Jane a un chien. Cela donne l'impression que Jane n'a qu'un chat, alors que ce n'est pas correct.

Vous devrez peut-être repenser le contenu de votre vue et ce que vous essayez d'accomplir avec votre vue, si vous commencez à filtrer les données valides.