質問
2つの別々のテーブルから製品の名前と売上数を取得しようとしています。
私のテーブルは次のように見えます:
BOOK
Book_ID | Book_Title | Book_Author
SOLD
Transaction_ID | Book_ID | Customer_ID
次のクエリから必要な結果のほとんどを取得できます
SELECT b.Book_Title, COUNT(s.Book_ID) FROM Book b, Sold s
WHERE b.Book_ID = s.Book_ID
GROUP BY b.Book_Title;
ただし、これは少なくとも1つの販売で製品のみを表示します。すべての製品を展示したいと思いますが、販売が発生していない場合はゼロを表示するだけです。私はこのようなことをいじりました:
SELECT b.Book_Title,
COUNT(CASE WHEN s.Book_ID IS NULL THEN 0 ELSE s.Book_ID END)
FROM Book b, Sold s WHERE b.Book_ID = s.Book_ID GROUP BY Book_Title;
しかし WHERE
条項は、1つ以上の販売の結果に結果を制限しています。
誰かがこれを回避する方法を提案できますか? Oracle 10gを使用しています。
ありがとう
解決
左外の結合を使用します:
SELECT b.Book_Title, COUNT(s.Book_ID)
FROM Book b left outer join Sold s on b.Book_ID = s.Book_ID
GROUP BY b.Book_Title;
他のヒント
また、相関サブクエリを使用することもできます select
節:
select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b
どちらも必要ありません group by
また outer join
S、非常に多くの行で遅くなる可能性があります。
@Vincentが言ったように、外側の結合が必要です。私は最近Oracleとあまり働いていませんが、その独自の外側結合構文はかなり奇妙です。 (彼らがそれについてANSIに追いついたかどうかはわかりません。)
独自の構文は次のとおりです。
SELECT b.Book_Title,
COUNT(s.Book_ID)
FROM Book b,
Sold s
WHERE b.Book_ID = s.Book_ID (+)
GROUP BY b.Book_Title;
サブクエリでカウントを取得し、そのように外側の結合を残してください。
select b.book_title,
case when s.book_id is null then 0
else s.salesCount end as Sales
from book b
left outer join
(select count(*) as salesCount, book_id from sales group by book_id) s on b.book_id = s.book_id
本から他の結合を販売します。あなたはまだカウントのためにヌルを取得するかもしれませんが、あなたはそれの上にNVLを追加することによってそれを解決します...
所属していません StackOverflow