2010-12-16 2 views
1

что делает этот запрос значитчто делает этот запрос значит

select fname, lname 
    from Owner 
    where not exists 
     (select fname, lname 
      from Trainer) 

, что я понимаю: он возвращает FName и LName от владельца таблицы, где эти имена не exsit в таблице тренера? Я прав?

ответ

3

Найти имена людей, которые есть в таблице Owner, но не в таблице Trainer.

+8

Возможно, это было намерение, но забывчивый автор запроса не связал суб-выбор с выбором верхнего уровня. Запрос возвращает все строки из `Owner`, если` Trainer` пуст или нет строк в противном случае. – 9000 2010-12-16 20:43:55

+0

@ 9000: Очень приятно поймать. Не могу поверить, что я пропустил это. – AgentConundrum 2010-12-16 20:49:42

2

Это довольно хромой способ получить список всех из таблицы owner, которая не существует в таблице trainer.

Таким образом, если таблица содержит Owner

---------------- 
fname | lname 
---------------- 
clark | kent 
lois | lane 
peter | parker 

и таблица Trainer содержит

---------------- 
fname | lname 
---------------- 
peter | parker 
hal  | jordan 

Вы должны получить результирующий набор:

---------------- 
fname | lname 
---------------- 
clark | kent 
lois | lane 

Update

На самом деле ваш запрос ничего не вернет, если в таблице тренера есть какие-либо записи. Вероятно, вы должны использовать:

select fname, lname 
from Owners 
where not exists (
    select fname, lname 
    from trainers 
    where fname=Owners.fname 
      and lname=Owners.lname 
    ) 
1

Запрос состоит из двух частей: «выбрать» и «где». Посмотрите на части где первый:

where not exists 
     (select fname, lname from Trainer) 

Это где пункт имеет значение «истина», если нет ничего в таблице тренер, и «ложь», если там что-то есть. Теперь посмотрим на «select» часть:

select fname, lname from Owners 

Это выбирает все строки из таблицы «Владельцы».

Объединяя это: запрос выбирает все строки из таблицы Owner IF (и только если) в таблице Тренера ничего нет, и абсолютно ничего, если есть.

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