2016-09-01 10 views
2

私は教科書を読んでいますが、私はこの質問を理解できません: すべてのボートを予約した船員を探してください。 EXCEPTコマンド - すべてのボートを予約した船員を探します

  1. 船員:SID、SNAME、評価、年齢(主:SID)
  2. ボート:入札(プライマリー:入札)
  3. 埋蔵:sidの、入札、我々は3つのテーブルを持っている

    • 日(プライマリー、SID、入札、日)(sidは船員への外部キーで、入札はボートに外部キーである)、クエリのために

、誰船員を探します「すべてのボートを予約しまし、与えられた答えは次のとおりです。

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. と、構文エラーを持って示して、クエリを実行する他の方法があります:すべての船を予約しました船員を探す

あなたは、この使用してCOUNTとCONCATを行うことができ、

+2

「except」はMySQLでは無効です。 SQL Serverで使用できます。 –

+0

'except'を' NOT EXISTS() 'に書き直すことができます – wildplasser

+1

そして' NOT IN() 'に書き換えることもできます:http://stackoverflow.com/q/26697519/905902 – wildplasser

答えて

2

、ありがとうございました。このクエリは、ボートテーブルの各ボートで(準備金の表で)対になっている船員を選択:

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いつか

2

私は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)); 
関連する問題