Mam stolik listy aktorów. Teraz, co chcę mieć listę aktorów, którzy mają te same nazwiska. Jeśli aktor ma wyjątkowe nazwisko, nie pojawi się w zestawie wyników.

W tym celu próbowałem:

SELECT a1.first_name, a1.last_name 
FROM actor a1, actor a2 
WHERE a1.last_name = a2.last_name AND a1.actor_id !=  a2.actor_id
ORDER BY a1.last_name; 

Teraz działa dobrze, z wyjątkiem, że otrzymuję wiele duplikatów wpisów. Jak na zdjęciu tutaj.

Wynika z duplikatów wpisów.

Result with duplicate entries.

Oczywiście jest oczywiste, że za każdym razem, gdy za każdym razem wpisuje się z nazwą ostatniego nazwiska innego wpisu, na liście drukowane jest nazwisko aktora. Jeśli pasuje do dwóch innych osób, drukuje go dwa razy. Ale pożądany sposób jest drukowanie tylko raz nawet w Istnieje wiele innych meczów, jak na zdjęciu tutaj.

Pożądany rezultat:

Desired result.

0
user8221504 19 luty 2018, 12:06

3 odpowiedzi

Najlepsza odpowiedź

Nie używaj połączenia, użyj skorelowanego podzapytania z istniejącym:

select a1.*
from actor a1
where exists (select *
              from actor a2
              where a2.last_name = a1.last_name
                and a2.actor_id <> a1.actor_id);
1
a_horse_with_no_name 19 luty 2018, 09:25

Aby usunąć duplikaty, po prostu dodaj klauzulę GROUP BY:

SELECT a1.first_name, a1.last_name 
FROM actor a1, actor a2 
WHERE a1.last_name = a2.last_name AND a1.actor_id !=  a2.actor_id
GROUP BY a1.first_name, a1.last_name
ORDER BY a1.last_name; 
0
Arnaud 19 luty 2018, 09:13

Myślę, że możesz użyć odrębnej klauzuli, która jest używana w instrukcji wyboru, aby usunąć zduplikowane wiersze z zestawu wyników.

Proszę o to artykuł: http://www.postgresqltutorial.com/postgresql-select-distingi/ .

Więc twoje zapytanie wyglądałyby tak:

SELECT DISTINCT a1.first_name, a1.last_name FROM actor a1, actor a2 WHERE a1.last_name = a2.last_name AND a1.actor_id != a2.actor_id ORDER BY a1.last_name;

0
DrColossos 19 luty 2018, 10:05