2016-03-22 7 views
1

私は3つのエンティティまたはテーブル:BOOK,SCIENCEおよびFICTIONを持っています。 SCIENCEFICTIONは、ISBNという外部キーを介してBOOKに接続されています。 BOOKにはAUTHORという別のフィールドも含まれています。この場合のORとUNION ALLの差

私は本が科学または小説のいずれかである著者をすべて選択したいと考えています。 2つの本の著者が同じ場合は、両方の記録を保持する必要があります。

私は(右、明らかではありません)、次の解決策を考え出した:

SELECT BOOK.AUTHOR AS AUTHOR FROM BOOK, FICTION, SCIENCE 
WHERE BOOK.ISBN = FICTION.ISBN OR BOOK.ISBN = SCIENCE.ISBN; 

しかし、正しいものは次のようになります。

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; 

確かに、彼らは異なる結果を生成します。私のクエリはもっと​​多くのレコードを返します。私の質問に何が問題なのですか?私のクエリとその下の「正しい」クエリの違いは何ですか?

+0

デカルト製品:https://en.wikipedia.org/wiki/Join_(SQL)#Cross_join - 最初のクエリは、すべてのテーブルを一緒にクロス結合します。 – ps2goat

+0

@ ps2goatしかし、なぜそれをやっているのですか? – nbro

+0

ここのデザインは少し疑わしいと思う。 'Fiction'エンティティと' Science'エンティティは、例えば 'Genre'という名前の' Book'エンティティの属性値でなければなりません。 – Edper

答えて

0

あり、クエリは、同様の行が組合選択の農産物一つだけのインスタンスがある場合、またはクエリのすべてのインスタンスを生成間違っていない..です

ORクエリ関係の結果を返す。..組合は集合論的を返します書籍のISBNはフィクションISBNと一致した場合に科学ISBNが一致した場合、その後、すべて科学レコードが参加し、その逆されている最初のクエリで結果

0

は、その後、すべてフィクションレコードが結合されています。

+0

しかし、なぜそれを行う必要がありますか?私の質問は、2つの条件が満たされている限り、すべての本の著者を返すように指示するべきではありませんか? – nbro

+0

私はこの問題は、私が「予約、批判、科学...」と言っているという事実に関連していると思います。つまり、私は3つのエンティティから言っていますが、通常は2あなたはどう思いますか? – nbro

+0

条件が満たされます。条件なしの結合は「デカルト積」と呼ばれます。n個のレコードがm個のレコードと結合されたテーブルは、n * mレコードになります。 WHERE条件は結果セットをフィルタリングするだけです。あなたの場合、(n * m1 + n * m2)レコード – devio

関連する問題