Ich habe drei Tabellen (Users, Items, UserItems) wobei UserItems eine Viele-zu-Viele-Beziehung zwischen Benutzern und Items ist. Was ich brauche, ist eine Abfrage, die alle Elemente erhält, die ein Benutzer nicht hat.SQL Server-Abfrage, wo keine Beziehung zwischen drei Tabellen existiert
ich eine SQL-Fiddle Beispiel mit einigen gefälschten Daten hier erstellt haben: http://sqlfiddle.com/#!6/a6856/1
CREATE TABLE Users (userID INT, firstName NVARCHAR(50))
CREATE TABLE Items (itemID INT, itemName NVARCHAR(50))
CREATE TABLE UserItems (userID INT, itemID INT)
INSERT INTO Users (userID, firstName)
VALUES (1, 'Jack'), (2, 'Jill'), (3, 'John'), (4, 'Jane');
INSERT INTO Items (itemID, itemName)
VALUES (1, 'Bucket'), (2, 'Water'), (3, 'Cast');
INSERT INTO UserItems (userID, itemID)
VALUES (1, 1), (1, 2), (1, 3), (2, 3);
gewünschten Ergebnisse Benutzer und welche Gegenstände sie nicht haben:
---------------------------------
| userID | firstName | itemName |
|--------|-----------|----------|
| 2 | Jill | Bucket |
| 2 | Jill | Water |
| 3 | John | Bucket |
| 3 | John | Water |
| 3 | John | Cast |
| 4 | Jane | Bucket |
| 4 | Jane | Water |
| 4 | Jane | Cast |
---------------------------------
HINWEIS: Jack tut muss nicht in den Ergebnissen sein, weil er alle drei Elemente hat.
Vielen Dank!
Die Unterabfragen sind im Hinblick auf die Leistung teuer. Normalerweise wird ein Join schneller ausgeführt als eine Unterabfrage. Google es für "JOINS vs SUBQUERIES". Dies ist keine Faustregel, manchmal wird der Ausführungsplan gleichwertig sein. –
Dieser funktioniert genauso gut wie die Antwort von @Nolan, aber ich mag diesen einen besser, weil es sauberer ist. Ich bemerke keinen Geschwindigkeitsunterschied, aber ich höre von der "Faustregel". – zabuuq