在 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
這樣是不是就滿足了我們的要求呢!