2010-09-10 3 views
1

У меня есть две таблицыTSQL Понимание выполнения запроса

Table Visitor 
ID Name CityName 
1 Jon  NY 
1 Jon  KY 
2 Paul NY 
1 paul TY 

Table City 
ID  CityName 
1  NY 
2  KY 
3  TY 

Я должен перечислить посетителя, который посетил все города в город таблице.

Я взял запрос из Интернета, но я не знаю, как он работает внутри.

Этот запрос

select distinct v1.name from Visitor v1 
where not exists 
      (
      select c.CityName from City c 
      where not exists 
       (
       select v2.CityName from visitor v2 where 
       v2.CityName=c.CityName and v1.Name=v2.Name 
      ) 
     ) 

Kinldy помочь мне понять послдоватльность

Итерация 1

Most outer query v1.Name=jon 

outer query  c.CityName=NY 

inner query  V2.CityName = c.CityName (NY=NY) 
        and v1.Name=v2.Name (Jon =Jon) 

inner query return valye (i.e) v2.CityName=NY 

NY not exists 
(   
    NY 
) 

consition не удается так ничего возврат

Итерация 2

Most outer query v1.Name=jon 

    outer query  c.CityName=NY 

    inner query  V2.CityName = c.CityName (KY=NY) 
         and v1.Name=v2.Name (Jon =Jon) 

    inner query return valye (i.e) v2.CityName=NULL 

NY not exists 
(   
    NULL 
) 

condition fails 
(i.e) NOT Exists is true so Jon is returned from outer most query. 

Я в порядке?

ответ

1

Это relational division query популяризированный пользователем Chris Date.

В основном используется двойной отрицательный. Чтобы переписать то, что он делает на английском языке: он выбирает всех посетителей, где нет города, которого они не посещали.

+0

Отлично ссылку, чтобы прочитать и понять запрос. – Amit

0

FYI, более простой подход:

select v1.name 
from Visitor v 
inner join City c on v.CityName = c.CityName 
group by v1.Name 
having count(distinct(c.CityName)) = 3 
Смежные вопросы