Powiedzmy, że mam następujące zapytanie.
SELECT ID, Email, ProductName, ProductModel FROM Products
Jak mogę go zmodyfikować, aby nie zwracał zduplikowanych wiadomości e-mail?
Innymi słowy, jeśli kilka wierszy zawiera ten sam e-mail, chcę, aby wyniki obejmowały tylko jeden z tych wierszy (najlepiej ostatni). Powielanie w innych kolumnach powinno być dozwolone.
Klauzule lubią DISTINCT
i GROUP BY
wydają się działać na całych wierszach. Więc nie jestem pewien, jak do tego podejść.
sql
sql-server
Jonathan Wood
źródło
źródło
Odpowiedzi:
Jeśli używasz SQL Server 2005 lub nowszego, użyj tego:
EDYCJA: Przykład z użyciem klauzuli where:
źródło
SELECT
potrzeby wymagająWHERE
stanu. Myślę, że numery wierszy zostaną przypisane do wszystkich wierszy w tabeli. Ta składnia jest trochę poza mną. Czy jest jakaś szansa na aktualizację, która gwarantowałaby jeden wiersz z określonym e-mailem spełniającymWHERE
warunek?JOIN
w zapytaniu. Gdy tylko mam aJOIN
,ROW_NUMBER
zwraca znacznie wyższe wartości niż „1”.Zakłada się, że SQL Server 2005+ i Twoja definicja „ostatniego” to maksymalne PK dla danego e-maila
źródło
Kiedy używasz,
DISTINCT
myśl o tym jako o odrębnym wierszu, a nie kolumnie. Zwróci tylko wiersze, w których kolumny nie pasują dokładnie tak samo.Zapytanie zwróci oba wiersze, ponieważ
ID
kolumna jest inna. Zakładam, żeID
kolumna jestIDENTITY
kolumną rosnącą, jeśli chcesz zwrócić ostatnią, to polecam coś takiego:TOP 1
Powróci tylko pierwszy rekord, zamawiając go przezID
malejącej powróci pierwszy wyniki z ostatniego rzędu. To da ci ostatni rekord.źródło
Możesz to zmienić za pomocą funkcji GROUP BY
źródło
SELECT id, max(email) AS email FROM tbl GROUP by email
. W SQL Server WSZYSTKIE kolumny wSELECT
klauzuli muszą być w funkcji agregującej. To mnie gryzie za każdym razem, gdy wracam.W przypadku programu Access możesz użyć zapytania SQL Select, które przedstawiam tutaj:
Na przykład masz tę tabelę:
KLIENT || NOMBRES || POCZTA
888 || T800 ARNOLD || [email protected]
123 || JOHN CONNOR || [email protected]
125 || SARAH CONNOR ||[email protected]
Musisz wybrać tylko odrębne wiadomości. Możesz to zrobić w ten sposób:
WYBÓR SQL:
Możesz użyć tego, aby wybrać maksymalny identyfikator, nazwę odpowiadającą temu maksymalnemu identyfikatorowi, możesz w ten sposób dodać dowolny inny atrybut. Następnie na końcu umieszczasz odrębną kolumnę do przefiltrowania i grupujesz ją tylko z ostatnią odrębną kolumną.
Zapewni to maksymalny identyfikator z odpowiednimi danymi, możesz użyć min lub dowolnej innej funkcji i zreplikować tę funkcję do zapytań podrzędnych.
Ta opcja zwróci:
KLIENT || NOMBRES || POCZTA
888 || T800 ARNOLD || [email protected]
125 || SARAH CONNOR ||[email protected]
Pamiętaj, aby zindeksować wybrane kolumny, a odrębna kolumna nie może zawierać danych liczbowych zawierających wszystkie duże lub małe litery, w przeciwnym razie nie będzie działać. Działa to również z tylko jedną przesyłką poleconą. Miłego kodowania !!!
źródło
Powód
DISTINCT
iGROUP BY
pracą nad całymi wierszami jest to, że zapytanie zwraca całe wiersze.Aby pomóc Ci zrozumieć: Spróbuj ręcznie napisać, co zapytanie powinno zwrócić, a zobaczysz, że nie jest jednoznaczne, co umieścić w nieuduplikowanych kolumnach.
Jeśli dosłownie nie obchodzi Cię, co jest w innych kolumnach, nie zwracaj ich. Zwracanie losowego wiersza dla każdego adresu e-mail wydaje mi się trochę bezużyteczne.
źródło
Spróbuj tego
źródło
Spróbuj tego:
źródło