1

我正在为期末考试而学习,这出现在过去的考试中:

表:护士-(nid:int,nname:string,age:real,salary:real,sid:int)
表:主管-(sid:int,rating:real)
表:WorksIn-(nid:inthid: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 部分有何联系。

4

2 回答 2

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

请注意在与评论员讨论时提出的以下几点:

  • 对每个护士单独评估子查询,而不是在所有护士的集合上单独评估
  • 也就是说,每个护士使得该护士不工作的多伦多医院的集合是空集。对每位护士的意义,他在多伦多所有医院工作。
  • 将子查询读作:“多伦多医院的集合,除了(读作集合差异或减去)护士工作的医院。”
于 2013-04-20T03:47:18.133 回答
0

对于每个单独的护士,子查询获取多伦多的所有医院,并排除她/他工作的所有医院。这给我们留下了她/他不工作的多伦多医院。为了满足NOT EXIST该护士的此类列表,需要为。所以这位护士必须在多伦多的每一家医院工作。

因此,查询返回在多伦多每一家医院工作的护士

鉴于多伦多的规模和医院的数量,这在人道上是不可能的,但这仍然是答案。

于 2013-04-20T04:12:03.253 回答