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