私は3つのエンティティまたはテーブル:BOOK
,SCIENCE
およびFICTION
を持っています。 SCIENCE
とFICTION
は、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;
確かに、彼らは異なる結果を生成します。私のクエリはもっと多くのレコードを返します。私の質問に何が問題なのですか?私のクエリとその下の「正しい」クエリの違いは何ですか?
デカルト製品:https://en.wikipedia.org/wiki/Join_(SQL)#Cross_join - 最初のクエリは、すべてのテーブルを一緒にクロス結合します。 – ps2goat
@ ps2goatしかし、なぜそれをやっているのですか? – nbro
ここのデザインは少し疑わしいと思う。 'Fiction'エンティティと' Science'エンティティは、例えば 'Genre'という名前の' Book'エンティティの属性値でなければなりません。 – Edper