Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

DISTINCT

Termin Definicja
DISTINCT

DISTINCT to klauzula Transact-SQL eliminująca zduplikowane wiersze z wyniku zapytania.

DISTINCT w zapytaniach Transact-SQL – czym jest i do czego służy

DISTINCT jest słowem kluczowym używanym w języku Transact-SQL do ograniczania powtarzających się wierszy zwracanych przez zapytanie. Jego działanie polega na tym, że po wykonaniu części odpowiedzialnej za wybór danych wynik jest porównywany pod kątem wszystkich kolumn wskazanych w klauzuli SELECT. Wiersze mające identyczne wartości we wszystkich tych kolumnach są traktowane jako powtórzenia, dlatego w końcowym rezultacie pozostaje tylko jeden przedstawiciel danej kombinacji wartości.

Znaczenie DISTINCT zależy więc nie od całego rekordu znajdującego się w tabeli, lecz od zestawu wyrażeń umieszczonych po SELECT. Jeżeli zostanie wybrana jedna kolumna, powtarzalność ocenia się wyłącznie na jej podstawie. Jeżeli zostaną wybrane trzy kolumny, porównywana jest pełna trójka wartości. Zmiana listy kolumn może zatem całkowicie zmienić liczbę wierszy otrzymanych w wyniku.

Przykładowe zapytanie SELECT DISTINCT miasto FROM Klienci; może posłużyć do uzyskania listy miejscowości występujących w tabeli bez wielokrotnego wyświetlania tej samej nazwy. W przypadku zapytania SELECT DISTINCT miasto, kod_pocztowy FROM Klienci; odrębność będzie ustalana dla pary wartości. Ta sama miejscowość może pojawić się ponownie, jeżeli w danych występuje z innym kodem pocztowym.

DISTINCT a porównywanie wyników, NULL i funkcje agregujące

W praktyce DISTINCT często porównuje się z innymi sposobami porządkowania i grupowania danych. ORDER BY zmienia kolejność wierszy, ale nie usuwa duplikatów. TOP ogranicza liczbę zwróconych rekordów, lecz również nie zapewnia ich unikalności. DISTINCT działa na poziomie wartości wynikowych i może zostać zastosowany niezależnie od tego, czy dane są sortowane.

Osobnego omówienia wymaga wartość NULL. Przy eliminowaniu powtórzeń wiele wystąpień NULL w tej samej kolumnie jest traktowanych jako jedna wspólna wartość wynikowa. Nie oznacza to, że NULL staje się zwykłym tekstem albo liczbą. Nadal pozostaje brakiem określonej wartości, jednak w zestawieniu DISTINCT nie tworzy wielu identycznie wyglądających pozycji.

DISTINCT może występować przy funkcjach agregujących. Konstrukcja COUNT(DISTINCT klient_id) służy do policzenia różnych identyfikatorów klientów, nawet gdy jeden klient pojawia się w wielu wierszach tabeli transakcji. Podobne zastosowanie może dotyczyć sumowania, choć w takim przypadku należy precyzyjnie określić, czy eliminowane mają być powtarzające się wartości, czy całe rekordy. Przykładowe użycie SUM(DISTINCT kwota) usuwa identyczne wartości kwot przed obliczeniem sumy, co nie zawsze odpowiada znaczeniu biznesowemu danych.

W zapytaniach z funkcjami agregującymi bez DISTINCT wartości są zwykle analizowane w ramach grup określonych przez GROUP BY. Gdy potrzebna jest lista unikalnych elementów, ale nie ma potrzeby obliczania agregatu, prostsze może być zastosowanie DISTINCT. Gdy natomiast trzeba policzyć rekordy, wyznaczyć minimum, maksimum lub sumę dla poszczególnych kategorii, GROUP BY zwykle lepiej opisuje intencję zapytania.

DISTINCT w relacjach tabel i typowych problemach z duplikatami

Jednym z częstych powodów pojawiania się powtórzeń jest łączenie tabel za pomocą JOIN. Jeżeli do jednego wiersza tabeli głównej pasuje kilka wierszy tabeli powiązanej, rezultat zawiera wiele kombinacji. Nie musi to oznaczać błędu w bazie. Może być prawidłowym odzwierciedleniem relacji jeden-do-wielu. Problem pojawia się wtedy, gdy celem jest wyświetlenie wyłącznie listy różnych elementów z tabeli głównej.

W takiej sytuacji DISTINCT może ograniczyć wynik, ale powinien być stosowany po sprawdzeniu przyczyny powtórzeń. Przykładowo zapytanie łączące osoby z ich zamówieniami zwróci jedną osobę wiele razy, jeżeli każda osoba ma kilka zamówień. Dodanie DISTINCT do wyboru samego identyfikatora lub nazwy osoby może dać oczekiwaną listę, jednak nie naprawia nieprawidłowego warunku łączenia. Jeżeli pominięto część kolumny klucza albo połączono nieodpowiednie pola, ukrycie skutku przez DISTINCT może utrudnić wykrycie problemu.

Powtórzenia mogą też wynikać z niejednoznacznych danych, niepełnych filtrów oraz z użycia widoków, które same korzystają z wielu tabel. Przed dodaniem DISTINCT warto przeanalizować strukturę zapytania, warunki ON i WHERE, relacje między kluczami oraz oczekiwaną liczność wyniku. Niekiedy bardziej właściwe będzie zastosowanie EXISTS, gdy potrzebne jest jedynie sprawdzenie, czy powiązany rekord istnieje. W innych przypadkach można użyć GROUP BY albo funkcji okienkowej, aby wskazać jeden konkretny wiersz z każdej grupy.

Nie należy utożsamiać DISTINCT z usuwaniem duplikatów zapisanych fizycznie w tabeli. Klauzula działa tylko na bieżący rezultat zapytania i nie modyfikuje danych źródłowych. Jeżeli w tabeli znajdują się powtarzające się rekordy, pozostaną one tam po wykonaniu SELECT DISTINCT. Do porządkowania danych przeznaczone są inne operacje, które wymagają wcześniejszego ustalenia reguły wyboru właściwego rekordu.

DISTINCT a wydajność zapytań i czytelność kodu

Eliminowanie powtórzeń może wymagać sortowania albo innego sposobu porównania wartości. Przy niewielkim zbiorze danych koszt takiej operacji bywa pomijalny, jednak przy dużych tabelach, wielu kolumnach i skomplikowanych połączeniach zapytanie może wykonywać się dłużej oraz zużywać więcej pamięci. Znaczenie ma typ danych, długość porównywanych pól, liczba wierszy, selektywność filtrów oraz dostępne indeksy.

Wydajność można poprawić przez ograniczenie liczby pobieranych kolumn, zastosowanie warunków filtrujących możliwie wcześnie oraz sprawdzenie planu wykonania. Jeżeli do dalszych obliczeń potrzebny jest tylko identyfikator, nie powinno się pobierać całego rekordu. Węższy zestaw danych oznacza mniej wartości do porównania i ułatwia ocenę rezultatu. Warto też pamiętać, że indeks nie zawsze eliminuje koszt DISTINCT, zwłaszcza gdy zapytanie korzysta z kilku tabel lub obliczanych wyrażeń.

Czytelność zapytania jest równie istotna jak jego szybkość. Samo dodanie DISTINCT może sprawiać wrażenie prostego rozwiązania, lecz czasem maskuje problem z relacją pomiędzy tabelami. Dobrym zwyczajem jest opisanie w komentarzu, dlaczego unikalność jest wymagana. Dzięki temu późniejsza modyfikacja struktury bazy lub raportu nie doprowadzi łatwo do przypadkowego usunięcia potrzebnych wierszy.

Warto również odróżnić unikalność techniczną od unikalności znaczeniowej. Dwa wiersze mogą mieć tę samą nazwę, lecz reprezentować różne obiekty rozpoznawane przez odmienne identyfikatory. Zastosowanie DISTINCT na samej nazwie połączy je w jeden wynik, mimo że z punktu widzenia aplikacji powinny pozostać rozróżnialne. Przed użyciem klauzuli należy więc określić, które kolumny tworzą właściwą tożsamość prezentowanego elementu.

DISTINCT – praktyczne wskazówki przed zgłoszeniem problemu

Przy diagnozowaniu nieoczekiwanych powtórzeń warto rozpocząć od uruchomienia zapytania bez DISTINCT i sprawdzenia, które kolumny różnią się pomiędzy pozornie identycznymi wierszami. Różnica może dotyczyć identyfikatora, daty, statusu albo wartości pochodzącej z tabeli powiązanej. Następnie można zawęzić listę SELECT do pól wymaganych przez raport i ponownie ocenić, czy powtarzalność nadal ma znaczenie.

Pomocne jest także sprawdzenie liczby rekordów przed i po zastosowaniu DISTINCT. Jeżeli wynik zmniejsza się znacznie, należy ustalić, czy usunięte wiersze były rzeczywiście zbędnymi powtórzeniami. Jeżeli znikają informacje opisujące różne zdarzenia, klauzula została prawdopodobnie zastosowana zbyt szeroko. W takim przypadku lepsze może być grupowanie po kluczu, wybranie najnowszego wpisu za pomocą funkcji okienkowej albo korekta warunku JOIN.

Przy pracy z bazą danych na komputerze lub w aplikacji użytkowej przydatne bywa zebranie konkretnego zapytania, fragmentu wyniku oraz informacji o tym, jaki rezultat miał zostać uzyskany. Tak przygotowany opis ułatwia ocenę, czy problem dotyczy samej składni, relacji tabel, jakości danych czy sposobu prezentacji. W sprawach związanych z działaniem oprogramowania i sprzętu można skorzystać z pomocy firmy Warszawskie Pogotowie Komputerowe 24/7, przekazując możliwie dokładny opis objawów i oczekiwanego działania.

Najważniejsza zasada brzmi: DISTINCT powinien wyrażać świadomą potrzebę otrzymania różnych wartości, a nie służyć jako automatyczne ukrywanie wszystkich powtórzeń. Połączenie analizy relacji, właściwego wyboru kolumn oraz kontroli planu wykonania pozwala uzyskać wynik jednocześnie poprawny, zrozumiały i dostosowany do rzeczywistego celu zapytania.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę