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に入れると、EXCEPTで構文エラーがあることが示されます

  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 に答える