2015-04-15 3 views
0

Я читал подобные вопросы, и я думаю, что делаю это правильно, но я просто хотел убедиться, что мой SQL правильный. (Тем не менее новые для SQL)Где значение столбца SQL не найдено в другом столбце

У меня есть 2 разные таблицы

Students 
    id, name, address 


Staff 
    id, name, address 

Мне нужно найти общее число студентов (которые не являются также сотрудники)

SO У меня есть следующий SQL

create view nstudents as 
select students.id 
from students 
LEFT JOIN staff ON staff.id = students.id; 

Затем я запускаю счет (*) на вид.

Может кто-нибудь подтвердить мой SQL правильно или есть лучший способ сделать это?

ответ

1

Ваш LEFT JOIN не исключает студентов, которые также являются персоналом, но это может быть полезно для достижения вашей цели. LEFT JOIN предоставляет вам все результаты из левой таблицы и соответствующие результаты из правой таблицы, или NULL результатов, если правая таблица не соответствует. Если вы это сделаете:

select count(*) 
from students 
LEFT JOIN staff ON staff.id = students.id 
WHERE staff.id IS NULL; 

Ожидаю, что вы получите то, что ищете.

+0

, но staff.id никогда не является NULL? Мне все еще нужно, чтобы там, где было условие? – user21902195

+0

'staff.id' никогда не будет' NULL' в таблице, но в результатах запроса он будет пустым, если не будет 'staff.id', что равно' students.id'. Это то, что делает 'LEFT JOIN', и поэтому вам нужно условие' WHERE'. –

0

Вы можете обнаружить, что более естественно сделать что-то вроде этого:

create view nstudents as 
    select s.id 
    from students s 
    where not exists (select 1 from staff st where st.id = s.id) ; 

Это должно иметь такую ​​же производительность, как left join.

Смежные вопросы