Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak usunąć zduplikowane wiersze z widoku?

DISTINCT nie pomoże, jeśli wiersze mają jakieś inne kolumny. Oczywiście jedna z tabel, do których się dołączasz, ma wiele wierszy dla jednego wiersza w innej tabeli. Aby odzyskać jeden wiersz, musisz wyeliminować wiele innych wierszy w tabeli, do której się dołączasz.

Najprostszym sposobem, aby to zrobić, jest rozszerzenie klauzuli where lub ograniczenia JOIN, aby dołączyć tylko do jednego rekordu, który chcesz. Zwykle wymaga to określenia reguły, która zawsze wybierze „poprawny” wpis z innej tabeli.

Załóżmy, że masz prosty problem, taki jak ten:

Person:  Jane
Pets: Cat, Dog

Jeśli utworzysz tutaj proste dołączenie, otrzymasz dwa rekordy dla Jane:

Jane|Cat
Jane|Dog

Jest to całkowicie poprawne, jeśli Twoim zdaniem jest lista wszystkich kombinacji ludzi i zwierząt. Jeśli jednak zamiast tego twój pogląd miał zawierać listę osób ze zwierzętami domowymi lub listę osób i pokazywać jedno z ich zwierząt, trafiłeś na problem, który masz teraz. W tym celu potrzebujesz reguły.

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

W ten sposób stosuje się regułę ograniczającą rekord Zwierzaków w dołączaniu do Zwierzaka o najniższym ID (pierwszy w tabeli Zwierzaki). Klauzula WHERE zasadniczo mówi „gdzie nie ma zwierząt należących do tej samej osoby o niższej wartości identyfikatora”.

Dałoby to jeden rekordowy wynik:

Jane|Cat

Reguła, którą musisz zastosować do swojego widoku, będzie zależeć od danych w Twoich kolumnach oraz od tego, który z „wielu” rekordów powinien być wyświetlany w kolumnie. Jednak spowoduje to ukrycie niektórych danych, które mogą nie być tym, czego chcesz. Na przykład powyższa zasada ukrywa fakt, że Jane ma psa. To sprawia wrażenie, jakby Jane miała tylko kota, kiedy to nie jest poprawne.

Być może będziesz musiał przemyśleć zawartość swojego widoku i to, co próbujesz osiągnąć za pomocą swojego widoku, jeśli zaczynasz filtrować prawidłowe dane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Początkowe połączenie z programem SQL Server Połączenie jest wolne. Czemu?

  2. Korzystanie z wyszukiwania pełnotekstowego w SQL Server 2008 w wielu tabelach, kolumnach

  3. Jak używać kursora do aktualizacji rekordu

  4. SQL Server:grupuj po kolei

  5. Jaka jest najlepsza metoda przekazywania parametrów do SQLCommand?