2009-04-27 18 views
5

私は、製品の名前とその販売数を別々の2つのテーブルから取得しようとしています。SQL文の記述数が

私のテーブルはこのような何かを見て:

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; 

から私が望む結果のほとんどを得ることができますしかし、これは少なくとも一つの販売の製品を表示します。私はすべての製品を表示したいと思います。売り上げがなかったらゼロを表示するだけです。私はこのような何かをいじりてきた:

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を使用しています。

おかげ

答えて

9

は、左の外側を使っ参加:

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; 
+0

ありがとうございました:) –

+0

COUNT()は実際には非ヌル値の数を数えていることに注意してください。 –

-1

他が販売する書籍から参加します。 まだカウントがnullになるかもしれませんが、その上にNVLを追加することで解決できます。

0

@Vincentは、外部結合が必要と言っています。私は最近、Oracleとはあまり働いていませんが、独自の外部結合構文はかなり奇妙です。そのようにに参加

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; 
0

あなたはサブクエリでのカウントを取得する必要がありますし、外側左:

独自の構文は次のとおりです(。私は、彼らがその上ANSIに追いついてきたかどうかわかりません) :

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 
1

またselect句で相関サブクエリを使用することができます。

select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b 

group byまたはouter joinのいずれも必要ありません。これは、非常に多くの行に対して遅くなる可能性があります。

関連する問題