Sql 两个连接的合并结果

Sql 两个连接的合并结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有3个表:Book、Invoice、Download,其中最后两个表有Book的外键。我需要知道每本书的成功发票和下载数量。为了得到结果,我有两个查询。第一个显示每本书的发票编号: select b.Title, sum(i.price) from Book b, Invoice i where i.BookId = b.Id and i.State = 'successful' group by b.Title select b.Title, count(1) from Book b, D

我有3个表:Book、Invoice、Download,其中最后两个表有Book的外键。我需要知道每本书的成功发票和下载数量。为了得到结果,我有两个查询。第一个显示每本书的发票编号:

select b.Title, sum(i.price)
from Book b, Invoice i
where i.BookId = b.Id and i.State = 'successful'
group by b.Title
select b.Title, count(1)
from Book b, Download d 
where d.BookId = b.Id and d.State = 'successful'
group by b.FarsiTitle
最后一个显示每本书的下载数量:

select b.Title, sum(i.price)
from Book b, Invoice i
where i.BookId = b.Id and i.State = 'successful'
group by b.Title
select b.Title, count(1)
from Book b, Download d 
where d.BookId = b.Id and d.State = 'successful'
group by b.FarsiTitle
我希望将结果作为单个表查看,因此我有3列:

书名、发票、下载


怎么可能呢?

我认为最简单的方法是关联子查询:

select b.*,
       (select count(*)
        from invoice i
        where i.BookId = b.Id and i.State = 'successful'
       ) as num_invoices,
       (select count(*)
        from download d
        where d.BookId = b.Id and d.State = 'successful'
       ) as numdownloads
from book b;
如果要使用
JOIN
,则需要在
JOIN
之前进行聚合,以获得正确的计数

编辑:

在SQL Server中,可以使用
outer apply

select b.*, i.num_invoices, i.price, d.numdownloads
from book b outer apply
     (select count(*) as num_invoices, sum(i.price) as price
      from invoice i
      where i.BookId = b.Id and i.State = 'successful'
     ) i outer apply
     (select count(*) as numdownloads
      from download d
      where d.BookId = b.Id and d.State = 'successful'
     ) d;

这与关联子查询非常相似,但允许您进行多个计算。

简单的并集all可以如下所示:

select b.Title, sum(i.price)
from Book b join Invoice i
on i.BookId = b.Id and i.State = 'successful'
group by b.Title

UNION ALL

select b.Title, count(1)
from Book b join Download d 
on d.BookId = b.Id and d.State = 'successful'
group by b.FarsiTitle

切勿在
FROM
子句中使用逗号。始终使用正确、明确的
JOIN
语法。谢谢Gordon。但是为什么我应该使用
JOIN
而不是扩展
from
呢?
from
子句中的逗号是过时的语法,不如
JOIN
强大。我们正处在21世纪,所以我们应该使用现代的、标准的SQL语言。我认为这是错误的。因为我需要根据书名合并结果,所以有三列。谢谢。似乎是正确的。所以我可以将
GROUPBY
子句放在b一书的
之后,并将书上的其他条件放在where子句中。但这不会造成任何性能问题?@AbouzarNouri。无需使用分组依据。您只需在
from
子句之后添加
where
book
的条件即可。我还有一个额外的问题!如果我想在每本书的发票总数之外加上sum(I.Price),是否可以扩展此查询,或者我应该添加第三个
select
子句?这太完美了!