sql >> Database >  >> RDS >> Sqlserver

Hoe verwijder ik dubbele rijen uit een weergave?

DISTINCT zal u niet helpen als de rijen kolommen hebben die anders zijn. Het is duidelijk dat een van de tabellen waaraan u deelneemt meerdere rijen heeft voor een enkele rij in een andere tabel. Om één rij terug te krijgen, moet je de andere meerdere rijen elimineren in de tabel waaraan je meedoet.

De eenvoudigste manier om dit te doen, is door uw where-clausule of JOIN-beperking zodanig te verbeteren dat alleen lid wordt van de enkele record die u wilt. Meestal vereist dit het bepalen van een regel die altijd de 'juiste' invoer uit de andere tabel selecteert.

Laten we aannemen dat u een eenvoudig probleem heeft zoals dit:

Person:  Jane
Pets: Cat, Dog

Als je hier een simpele join aanmaakt, ontvang je twee records voor Jane:

Jane|Cat
Jane|Dog

Dit is volledig correct als het uw standpunt is om alle combinaties van mensen en huisdieren op te sommen. Als je weergave in plaats daarvan mensen met huisdieren zou moeten weergeven, of een lijst met mensen en een van hun huisdieren, dan heb je het probleem dat je nu hebt. Hiervoor heb je een regel nodig.

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

Wat dit doet, is een regel toepassen om het Pets-record in de join te beperken tot het Pet met de laagste ID (eerste in de Pets-tabel). De WHERE-clausule zegt in wezen "als er geen huisdieren zijn van dezelfde persoon met een lagere ID-waarde).

Dit zou een resultaat van één record opleveren:

Jane|Cat

De regel die u op uw weergave moet toepassen, is afhankelijk van de gegevens in de kolommen die u heeft en welke van de 'meerdere' records in de kolom moeten worden weergegeven. Dat zal er echter toe leiden dat sommige gegevens worden verborgen, wat misschien niet is wat u wilt. De bovenstaande regel verbergt bijvoorbeeld het feit dat Jane een hond heeft. Hierdoor lijkt het alsof Jane alleen een kat heeft, terwijl dit niet correct is.

Als u geldige gegevens begint uit te filteren, moet u wellicht de inhoud van uw weergave heroverwegen en wat u probeert te bereiken met uw weergave.



  1. Waarom voorkomt deze regel niet dat dubbele sleutels worden geschonden?

  2. Postgresql:waarde van een kolom uit een bestand invoegen

  3. Kan de resultaten niet ophalen door invoer door te geven als xml-pad in oracle

  4. C# in bulk kopiëren naar PostgreSql