1

JOINSについて学習していて、次の質問についてサポートが必要です。

BOOKSテーブル内のすべての本のリストを表示します。顧客が本を注文した場合は、注文番号と顧客の居住地も記載してください。

これは私ができることです。Oracle11g。

SELECT B.TITLE, O.ORDER#, C.STATE FROM BOOKS B
   LEFT OUTER JOIN ORDERITEMS OI ON B.ISBN = OI.ISBN
   LEFT OUTER JOIN ORDERS O ON O.ORDER# = OI.ORDER#
   LEFT OUTER JOIN CUSTOMERS C ON C.CUSTOMER# = O.CUSTOMER#;

このクエリでは、結果に35行が表示されます。私のBOOKSテーブルには14行しかありません。私のORDERITEMSテーブルには32行あります。余分な3行は、注文したことのない本だと思いますか?私が持っていることさえ意味がありますか。本のテーブルには14行しかないので、私は考えています。それで、私が返す必要があるのはそれだけですか?同じ本が複数の注文で存在するため、それは不可能だと思います。

4

1 に答える 1

0

あなたは区別を始めたかもしれませんINNER JOIN、そしてそれLEFT JOINに基づいてLEFT JOIN左側の一致しない行を除外しません。ただし、それでも逆のことが起こるのを防ぐことはできません。

同じISBNを持つ複数の「orderitems」がある場合(または、可能性は低いですが、同じORDER#を持つ複数の注文、または同じCUSTOMER#を持つ複数の顧客)、そのような一致はすべて、対応する左側の行を複製します。あなたの場合の「本」。

次のように問題のある本を表示できます。

SELECT B.TITLE, B.ISBN, COUNT(*) FROM BOOKS B
LEFT OUTER JOIN ORDERITEMS OI ON B.ISBN = OI.ISBN
GROUP BY B.ISBN, B.TITLE
HAVING COUNT(*) > 1
于 2012-06-24T20:27:37.500 に答える