sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan fjerner jeg dublerede rækker fra en visning?

DISTINCT hjælper dig ikke, hvis rækkerne har nogle kolonner, der er forskellige. Det er klart, at en af ​​de tabeller, du tilslutter dig, har flere rækker for en enkelt række i en anden tabel. For at få en række tilbage, skal du eliminere de andre flere rækker i den tabel, du slutter dig til.

Den nemmeste måde at gøre dette på er at forbedre din where-klausul eller JOIN-begrænsning til kun at deltage i den enkelte post, du gerne vil have. Normalt kræver dette, at man bestemmer en regel, som altid vil vælge den 'korrekte' post fra den anden tabel.

Lad os antage, at du har et simpelt problem som dette:

Person:  Jane
Pets: Cat, Dog

Hvis du opretter et simpelt join her, vil du modtage to poster for Jane:

Jane|Cat
Jane|Dog

Dette er fuldstændig korrekt, hvis dit synspunkt er at liste alle kombinationerne af mennesker og kæledyr. Men hvis din visning i stedet skulle angive personer med kæledyr, eller liste personer og vise et af deres kæledyr, ramte du det problem, du har nu. Til dette har du brug for en regel.

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);

Hvad dette gør, er at anvende en regel for at begrænse kæledyrsposten i joinforbindelsen til kæledyret med det laveste ID (først i kæledyrstabellen). WHERE-klausulen siger i det væsentlige "hvor der ikke er kæledyr, der tilhører den samme person med en lavere ID-værdi).

Dette ville give et resultat på én rekord:

Jane|Cat

Den regel, du skal anvende på din visning, afhænger af dataene i de kolonner, du har, og hvilken af ​​de 'flere' poster, der skal vises i kolonnen. Det vil dog ende med at skjule nogle data, som måske ikke er, hvad du ønsker. For eksempel skjuler ovenstående regel det faktum, at Jane har en hund. Det får det til at se ud, som om Jane kun har en kat, når dette ikke er korrekt.

Du skal muligvis genoverveje indholdet af din visning, og hvad du forsøger at opnå med din visning, hvis du begynder at filtrere gyldige data fra.



  1. Mysql, PDO - Ligesom erklæring virker ikke ved hjælp af bindParam

  2. Find gratis slots i et bookingsystem

  3. Skift MySQL lagret procedure 'Database Collation' navn

  4. SqlDependency udløser ikke OnChange-hændelsen, når datasættet ændres