在 SQL Server 中合理的使用 LEFT OUTER join 进行开发!
2024-08-31 00:48:04
供稿:网友
比如我们想对某人的消费项目进行汇总,对应以下两个表:theme 与 themedetail
theme 的记录为:
themeid(int) themename(varchar[10])
1 就餐
2 出差
3 乘车
4 其它
themedetail 的记录为:
detailid(int) themeid(int) price(money)
1 1 12.5
2 1 5
3 1 6
4 2 11
5 2 17
6 3 8
其中 theme 中的 themeid 与 themedetail 中的 themeid 是一对多的关系,对 themedetail 表的理解如下:“就餐”费用为 12.5 + 5 + 6 = 23.5 元,“出差”费用为 11 + 17 = 28 元,“乘车”费用为 8 = 8 元,“其它”费用不存在,视为 0 处理,对应的 sql 语句可以这样表示:
select top 100 percent dbo.theme.themename, isnull(sum(dbo.themedetail.price), 0)
as totalprice
from dbo.theme inner join
dbo.themedetail on dbo.theme.themeid = dbo.themedetail.themeid
group by dbo.theme.themename, dbo.theme.themeid
order by dbo.theme.themeid
执行结果如下:
themename totalprice
就餐 23.5
出差 28
乘车 8
对于消费记录不存的记录如果就这样不显示它的话,使用内联的方法就可以满足要求了,但是我们现在需要对 theme 中的每一项均做统计,也包括“其它”项,于是我们应该采用另一种方法来实现,这就是左外联的方法,相应的 sql 语句可以这样表示:
select top 100 percent dbo.theme.themename, isnull(sum(dbo.themedetail.price), 0)
as totalprice
from dbo.theme left outer join
dbo.themedetail on dbo.theme.themeid = dbo.themedetail.themeid
group by dbo.theme.themename, dbo.theme.themeid
order by dbo.theme.themeid
执行结果如下:
themename totalprice
就餐 23.5
出差 28
乘车 8
其它 0
这样是不是就满足了我们的要求呢!