首页 > 数据库 > SQL Server > 正文

在 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

这样是不是就满足了我们的要求呢!
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表