我有几张桌子我试图加入,但是如果没有数据我会错过一些行,但是想要显示它们
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中没有相应的数据,则该国家/地区不会显示在我的结果中。有什么想法吗?
答案 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;
请注意,表别名使查询更容易编写和读取。