2016-09-01 4 views
2

Ich lese ein Lehrbuch und ich verstehe diese Abfrage nicht: Finde Segler, die alle Boote reserviert haben.AUSSER Befehl - Finde Segler, die alle Boote reserviert haben

  • Wir haben 3 Tabellen:
    1. Sailors: sid, sname, Bewertung, Alter (primär: sid)
    2. Boote: Gebot (primär: bid)
    3. Reserven: sid, bid, Tag (primär, sid, Gebot, Tag) (sid Fremdschlüssel für Segler ist, ist Gebot der Fremdschlüssel für Boote)

Für die Abfrage, finden Segler, Habe alle Boote reserviert, da die Antwort lautet:

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

Meine Fragen sind:

  1. Gibt es etwas falsch mit der obigen Abfrage? Wenn ich es in MySQL Workbench setzen, es zeigt, dass ich mit der Syntaxfehler haben AUSSER

  2. Neben der Lösung durch das Buch oben gegeben, ist es eine andere Möglichkeit, die Abfrage zu tun: Segler finden, die alle Boote reserviert haben

Danke,

+2

'except' ist in MySQL nicht gültig. Sie können es in SQL Server verwenden. –

+0

Sie können das 'except' in' NOT EXISTS() ' – wildplasser

+1

umschreiben und Sie könnten es sogar in' NOT IN() 'umschreiben: http://stackoverflow.com/q/26697519/905902 – wildplasser

Antwort

2

Sie können diese unter Verwendung von COUNT und CONCAT tun. Diese Abfrage wählt die Segler, die (in der Reserves Tabelle) mit jedem Boot im Boot Tisch gepaart sind:

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 

hier getestet: http://sqlfiddle.com/#!9/82005/2

2

Irgendwann habe ich gesehen, dass EXCEPT nicht aufgrund funktionieren Unverträglichkeit mit der installierten Version MySql. Im Folgenden ist die Abfrage, die anstelle von Ihnen mit NOT EXISTS verwendet werden kann.

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