2016-09-01 14 views
2

我正在閱讀教科書,我無法理解此查詢: 查找預訂了所有船隻的船員。EXCEPT command - 查找預約了所有船隻的船員

  • 我們有3個表:
    1. 水手:SID,SNAME,等級,年齡(初級:SID)
    2. 船:投標(初級:BID)
    3. 儲量:SID,競價天(初級,SID,競價天)(SID是外鍵水手,出價外鍵船)

對於查詢,查找水手誰「VE保留所有船隻,給出的答案是:

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

'except'在MySQL中無效。你可以在SQL Server中使用它。 –

+0

您可以將'except'重寫爲'NOT EXISTS()' – wildplasser

+1

而且您甚至可以將其重寫爲'NOT IN()':http://stackoverflow.com/q/26697519/905902 – wildplasser

回答

2

爲此,您可以使用COUNT和CONCAT。此查詢選擇在船上表配對(在預備隊表),水手們與各船:

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));