2010-09-10 96 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

這是由Chris Date推廣的relational division query

它基本上使用雙重否定。重寫它在英語中的作用:它選擇沒有他們沒有訪問過的城市的所有訪問者。

+0

優秀的鏈接來閱讀和理解查詢。 – Amit 2010-09-10 19:43:15

0

僅供參考,更簡單的方法是:

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