2

我正在阅读一本教科书,但我不明白这个查询:查找已预订所有船只的水手。

  • 我们有 3 张桌子:
    1. 水手:sid、sname、等级、年龄(主要:sid)
    2. 船:出价(主要:出价)
    3. Reserves: sid, bid, day (primary, sid, bid, day) (sid是水手的外键,bid是船的外键)

对于查询,查找已预订所有船只的水手,给出的答案是:

SELECT  S.sname
FROM  Sailors S
WHERE  NOT EXISTS 
          ((SELECT  B.bid
             FROM  Boats B)
            EXCEPT
             (SELECT  R.bid
              FROM  Reserves R
              WHERE  R.sid=S.sid))

我的问题是:

  1. 上面的查询有问题吗?当我将它放入 MySQL Workbench 时,它显示我有语法错误,除了

  2. 除了上面书中给出的解决方案,还有没有其他的查询方式:查找已预订所有船只的水手

谢谢,

4

3 回答 3

3

您可以使用 COUNT 和 CONCAT 执行此操作。此查询选择与船表中的每艘船配对(在 Reserves 表中)的水手:

SELECT Sailors.name
FROM Sailors INNER JOIN
(SELECT Reserves.sid
 FROM Reserves
 GROUP BY Reserves.sid
 HAVING COUNT(DISTINCT CONCAT(Reserves.sid, Reserves.bid)) =
 (SELECT COUNT(DISTINCT Boats.bid)
  FROM Boats)) sub
ON Sailors.sid = sub.sid

在这里测试:http ://sqlfiddle.com/#!9/82005/2

于 2016-09-01T19:09:29.127 回答
3

有时我看到EXCEPT由于与已安装的MySql. 以下是可以用来代替您使用的查询NOT EXISTS

SELECT S.sname 
FROM Sailors S
WHERE NOT EXISTS (SELECT B.bid 
                  FROM Boats B
                  WHERE NOT EXISTS(SELECT R.bid
                                   FROM Reserves R
                                   WHERE R.bid = B.bid
                                         AND R.sid = S.sid));
于 2017-04-10T09:10:24.837 回答
0

应使用以下查询:

SELECT sname FROM Sailors s ,Reserves r WHERE  s.sid=r.sid AND r.bid=ALL(SELECT b.bid FROM boats b);
于 2018-04-19T07:42:43.440 回答