2016-03-22 10 views
1

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?

+0

Kartesisches Produkt: https://en.wikipedia.org/wiki/Join_(SQL)#Cross_join - die erste Query verbindet alle Tabellen miteinander. – ps2goat

+0

@ ps2goat Aber warum macht es das? – nbro

+0

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

Antwort

0

Es Abfrage ist nicht falsch, die OR-Abfrage alle Instanz erzeugen, wenn es ähnliche Reihen der Union wählen Sie produzieren nur eine Instanz ..

Die ODER-Abfrage, die die Beziehung Ergebnis zurück .. die Gewerkschaft eine Rückkehr mengentheoretische Ergebnisse

0

In der ersten Abfrage, ob ein Buch der ISBN eine Fiction ISBN übereinstimmt, dann alle Wissenschaft Datensätze miteinander verbunden sind, und umgekehrt, wenn eine Wissenschaft ISBN übereinstimmt, dann alle Fiction Datensätze miteinander verbunden sind.

+0

Aber warum sollte es das tun? Sollte meine Anfrage nicht nur darauf hinweisen, alle Autoren des Buches zurückzugeben, vorausgesetzt, dass die beiden Bedingungen erfüllt sind? – nbro

+0

Ich denke, dass das Problem mit der Tatsache zusammenhängt, dass ich '' FROM BOOK, FICTION, SCIENCE ... sage ", das heißt, ich sage von 3 Entitäten, aber normalerweise sagen wir nur von 2, wie in der Lösung ... was denkst du? – nbro

+0

Die Bedingungen treffen sich - entweder, oder. Ein Join ohne Bedingung wird als "kartesisches Produkt" bezeichnet: Eine Tabelle mit n Datensätzen, die mit einer Tabelle mit m Datensätzen verbunden sind, führt zu n * m Datensätzen. Eine WHERE-Bedingung filtert nur die Ergebnismenge. In Ihrem Fall erhalten Sie (n * m1 + n * m2) Datensätze – devio