我正在尝试从两个单独的表中获取产品的名称和销售数量。
我的表看起来像这样:
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。
由于
答案 0 :(得分: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;
答案 1 :(得分: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
,对于非常多的行来说可能会很慢。
答案 2 :(得分:0)
正如@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;
答案 3 :(得分:0)
您应该在子查询中获取计数,并将外部联接保留为:
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
答案 4 :(得分:-1)
从书到卖另一个联盟。 您仍然可以获得计数的空值,但是您可以通过在其上添加NVL来解决此问题...