5

我正在尝试从两个单独的表中获取产品的名称及其销售数量。

我的表看起来像这样:

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。

谢谢

4

5 回答 5

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;
于 2009-04-27T21:26:56.700 回答
1

您还可以在select子句中使用相关子查询:

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

它不需要group byor outer join,这对于非常多的行可能会很慢。

于 2009-04-27T23:07:16.240 回答
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;
于 2009-04-27T21:28:28.053 回答
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
于 2009-04-27T21:29:51.153 回答
-1

从书到售出另一个连接。你可能仍然会得到一个空值,但你可以通过在上面添加一个 NVL 来解决这个问题......

于 2009-04-27T21:27:01.863 回答