質問

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 joinS、非常に多くの行で遅くなる可能性があります。

@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を追加することによってそれを解決します...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top