sql >> Databasteknik >  >> RDS >> Sqlserver

Hur tar jag bort dubbletter av rader från en vy?

DISTINCT hjälper dig inte om raderna har några kolumner som är olika. Uppenbarligen har en av tabellerna du går med i flera rader för en enda rad i en annan tabell. För att få tillbaka en rad måste du eliminera de andra flera raderna i tabellen du går med i.

Det enklaste sättet att göra detta är att förbättra din where-klausul eller JOIN-begränsning till att bara gå med i den enda post du vill ha. Vanligtvis kräver detta att man bestämmer en regel som alltid väljer "korrekt" post från den andra tabellen.

Låt oss anta att du har ett enkelt problem som detta:

Person:  Jane
Pets: Cat, Dog

Om du skapar en enkel anslutning här, skulle du få två poster för Jane:

Jane|Cat
Jane|Dog

Detta är helt korrekt om din synvinkel är att lista alla kombinationer av människor och husdjur. Men om din vy istället var tänkt att lista personer med husdjur, eller lista personer och visa ett av deras husdjur, träffar du det problem du har nu. För detta behöver du 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);

Vad detta gör är att tillämpa en regel för att begränsa husdjursposten i anslutningen till husdjuret med lägst ID (först i tabellen husdjur). WHERE-klausulen säger i huvudsak "där det inte finns några husdjur som tillhör samma person med ett lägre ID-värde).

Detta skulle ge ett rekordresultat:

Jane|Cat

Regeln du måste tillämpa på din vy beror på data i kolumnerna du har och vilken av de "flera" posterna som ska visas i kolumnen. Det kommer dock att sluta dölja vissa data, som kanske inte är vad du vill ha. Till exempel döljer regeln ovan det faktum att Jane har en hund. Det får det att se ut som om Jane bara har en katt, när detta inte är korrekt.

Du kan behöva tänka om innehållet i din vy och vad du försöker åstadkomma med din vy om du börjar filtrera bort giltig data.



  1. Ta bort/ersätta specialtecken i kolumnvärden?

  2. Varför fungerar inte min JDBC-uppdatering?

  3. Hur tolkar MySQL VARCHAR-fältstorleken?

  4. Python JSON-kodare för att stödja datetime?