Sql 两个连接的合并结果
我有3个表:Book、Invoice、Download,其中最后两个表有Book的外键。我需要知道每本书的成功发票和下载数量。为了得到结果,我有两个查询。第一个显示每本书的发票编号: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
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
子句?这太完美了!