Ich habe 3 Entitäten oder Tabellen: BOOK
, SCIENCE
und FICTION
. SCIENCE
und FICTION
sind über einen Fremdschlüssel namens ISBN
mit BOOK
verbunden. BOOK
enthält auch ein weiteres Feld namens AUTHOR
.Unterschied zwischen OR und UNION ALL in diesem Fall
Ich möchte alle Autoren auswählen, deren Buch entweder Wissenschaft oder Fiktion ist. Wenn zwei Bücher denselben Autor haben, sollte ich beide Aufzeichnungen behalten.
Ich kam mit der folgenden Lösung auf (was nicht stimmt offenbar ist):
SELECT BOOK.AUTHOR AS AUTHOR FROM BOOK, FICTION, SCIENCE
WHERE BOOK.ISBN = FICTION.ISBN OR BOOK.ISBN = SCIENCE.ISBN;
Aber das sollte korrekt sein:
SELECT BOOK.AUTHOR AS AUTHOR FROM BOOK, FICTION
WHERE BOOK.ISBN = FICTION.ISBN
UNION ALL
SELECT BOOK.AUTHOR AS AUTHOR FROM BOOK, SCIENCE
WHERE BOOK.ISBN = SCIENCE.ISBN;
der Tat produzieren sie unterschiedliche Ergebnisse. Meine Abfrage gibt viel mehr Datensätze zurück. Was ist falsch an meiner Anfrage? Was ist der Unterschied zwischen meiner Abfrage und der "richtigen" Abfrage darunter?
Kartesisches Produkt: https://en.wikipedia.org/wiki/Join_(SQL)#Cross_join - die erste Query verbindet alle Tabellen miteinander. – ps2goat
@ ps2goat Aber warum macht es das? – nbro
Ich denke, das Design hier ist ein wenig verdächtig. Die Entitäten "Fiktion" und "Wissenschaft" sollten ein Attributwert von "Buch" sein, beispielsweise "Genre". – Edper