如果没有相应的数据,记录不会显示

时间:2018-02-02 19:51:07

标签: sql sql-server

我有几张桌子我试图加入,但是如果没有数据我会错过一些行,但是想要显示它们

 tblCountry
 sID      sCountry 
 1        Algeria
 2        Armenia
 3        Belgium

 tblRefData
 RefID    IDnum       sID
 1        7           1
 2        8           2
 3        9           3

 tblMData 
 IDnum        IDa
 7            123
 8            123

这是我的查询的样子:

Select tblCountry.sCountry, count(tblMData.Ida) as CountIDa
From tblRefData 
inner join tblMData on tblRefData.IDnum = tblMData.IDnum
inner join tblCountry on tblRefData.sID = tblCountry.sID
GroupBy tblCountry.sCountry

我期望的最终结果是:

sCountry       CountIDa
Algeria        1
Armenia        1
Belgium        0

我目前得到的是

sCountry       CountIDa
Algeria        1
Armenia        1

因此,如果国家/地区在tblMData中没有相应的数据,则该国家/地区不会显示在我的结果中。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果on条件列值不匹配,则应使用left join

Select 
    tblCountry.sCountry, 
    case 
       when (count(tblMData.Ida) is null) then 0 end as CountIDa
From 
    tblRefData 
left join 
    tblMData on tblRefData.IDnum = tblMData.IDnum
left join 
    tblCountry on tblRefData.sID = tblCountry.sID
Group By 
    tblCountry.sCountry

答案 1 :(得分:1)

您可以将“INNER JOIN”更改为“LEFT JOIN”,以便在没有相应数据时恢复数据。然后你可以使用ISNULL()函数将NULL值设置为零。

答案 2 :(得分:1)

您需要left join,但必须重新排列from子句:

Select c.sCountry, count(m.Ida) as CountIDa
From tblCountry c left join
     tblRefData r
     on r.sID = c.sID left join
     tblMData m
     on r.IDnum = m.IDnum
GroupBy c.sCountry;

请注意,表别名使查询更容易编写和读取。