TSQL Понимание выполнения запроса - PullRequest
1 голос
/ 10 сентября 2010

У меня есть две таблицы

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
)

Сбой в работе, поэтому ничего не возвращается

Итерация 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.

Прав ли я в понимании?

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Это запрос реляционного деления , популяризированный Крисом Дейтом.

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

0 голосов
/ 10 сентября 2010

К вашему сведению, более простой подход:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...