2012-10-28 8 views
7

Dla uproszczenia, mam dwie tabele związane z jednego do wielu używając klucza obcego, na przykład:Wybór klucze podstawowe, które nie mają kluczy obcych w innej tabeli

Users table: 
id 
name 

Actions table: 
id 
user_id 

jeden użytkownik może mieć wiele działań lub nie . Potrzebuję selekcji sql, która zwraca identyfikatory użytkowników, które nie mają wartości user_id w tabeli akcji.

Users Table: 
id  name 
1  John 
2  Smith 
3  Alice 

Actions Table: 
id  user_id 
1  3 
2  1 

Więc muszę zapytanie SQL, która zwraca identyfikator użytkownika 2 (Smith), ponieważ klucz obcy wartości nie zawierają identyfikator 2

Próbowałem następujących SQL, ale zwraca wszystkie identyfikatory użytkowników :

SELECT users.id from users left join actions on actions.user_id is null 

Odpowiedz

11
select u.id 
from users u 
left outer join actions a on a.user_id = u.id 
where a.user_id is null 
2
SELECT u.id 
FROM users u 
LEFT JOIN actions a 
    ON a.user_id = u.id 
WHERE a.user_id IS NULL 
+0

Nie zwrócił żadnego wyniku. – SaidbakR

+0

Tak, miałam literówkę w moim zapytaniu. – bobwienholt

4

Zoptymalizowana wersja będzie:

SELECT u.id 
FROM users u 
LEFT JOIN actions a 
ON a.user_id = u.id 
AND ISNULL(a.user_id) 
+0

zwrócił wszystkich użytkowników. – SaidbakR

+0

masz rację, miałem błąd typu poprawnego: NA a.user_id = u.id – ChaosClown

Powiązane problemy