我正在尝试从两个不同的表中获取产品名称及其销售数量。
我的表看起来像这样:
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。
谢谢
发布于 2009-04-27 21:26:57
使用左外部联接:
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-27 23:07:16
您还可以在select子句中使用相关子查询:
select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b它既不需要group by也不需要outer joins,后者对于非常大的行数可能会很慢。
发布于 2009-04-27 21:28:28
正如@Vincent所说,你需要一个外部连接。我最近没怎么用过Oracle,但它专有的outer join语法相当奇怪。(我不知道他们是否在这方面赶上了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;https://stackoverflow.com/questions/795341
复制相似问题