这个查询有什么作用?

时间:2013-04-20 03:37:30

标签: sql

我正在读期末考试,这是在过去的考试中出现的:

  

表:护士 - ( nid:int ,nname:string,年龄:真实,工资:真实,   sid:int)
表:主管 - ( sid:int ,评级:真实)
  表:WorksIn - ( nid:int hid:int ,hours:real)
表:   医院 - ( hid:int ,hname:string,tid:int)
表:城镇 -   ( tid:int ,tname:string,mayor:string)

     

解释以下查询检索的内容:

SELECT nname
FROM Nurse N
WHERE NOT EXISTS
    (    (SELECT H.hid
          FROM Hospital H
          WHERE H.town = ‘Toronto’)
     EXCEPT
         (SELECT W.hid
         FROM WorksIn W
         WHERE N.nid = W.nid))

这个查询有什么作用?我可以理解,子查询返回多伦多所有没有护士工作的医院,但我不知道它与NOT EXIST部分有什么联系。

2 个答案:

答案 0 :(得分:6)

分阶段考虑:

The set of nurses where 
  there does not exist
    a hospital in Toronto where the nurse doesn't work.

根据排除中间的法则变成

The set of nurses where
  the nurse works in all Toronto hospitals

请注意与评论员讨论时提出的这些观点:

  • 每个护士单独评估子查询,而不是单独评估所有护士
  • 也就是说,每个护士使得护士不工作的多伦多医院是空集。每位护士的意思是,他在多伦多的所有医院工作。
  • 将子查询读作:"多伦多医院的一套,除了(读作差异或减去)护士工作的医院。"

答案 1 :(得分:0)

对于每位护士,子查询需要多伦多的所有医院,并且不包括所有他/她工作的医院。这让我们留下了多伦多医院,他/她不工作。要满足NOT EXIST此护士的此类列表需要为空。所以这位护士必须在每个多伦多医院工作。

因此查询返回护士,这些护士在每个多伦多医院工作

考虑到多伦多的规模和医院的数量,这不是人道的可能,但这仍然是答案。