SQL语句不返回所有字段

DMC*_*pps 1 sql join

我有以下SQL语句:

    SELECT r.Result AS Resuly, 
           COUNT(f.fieldID) AS [Count] 
      FROM dbo.Fields f
RIGHT JOIN dbo.Results r ON f.Results = r.ID
     WHERE f.RegionID = @RegionID
  GROUP BY r.Result
Run Code Online (Sandbox Code Playgroud)

我想要声明的是返回所有不同的结果(他们是否在Field DB中有计数).目前,Query仅返回具有计数的值.

即在重新拥有的数据库中我有

ID 1, 2 and 3
Result x, y, z
Run Code Online (Sandbox Code Playgroud)

只有x和z在字段DB中有需要此结果的字段,所以我才回来

Result x, z
count 1, 2
Run Code Online (Sandbox Code Playgroud)

我想要的是什么

Result x,y,z
Count 1,(null or 0), 2
Run Code Online (Sandbox Code Playgroud)

Nic*_*rey 6

那是因为你的where子句过滤掉没有字段的结果.在连接完成应用
where子句; 在JOIN 之前应用该子句中的条件.ON

执行SQL select查询的[概念]过程是:

  • 计算from子句中所有表的笛卡尔积.
  • 应用加入条件
  • 如果存在,则应用where标准.
  • 根据group by子句中的条件(如果存在)将结果集划分为组.
  • 计算指定的任何汇总(聚合)函数的值,将每个组折叠为单个行,其列仅包含聚合函数,常量值或分组列.
  • 应用having条款指定的条件(如果存在).
  • order by如果存在,则根据该条款对结果进行排序.
  • 计算compute/ compute by子句中指定的聚合函数的值(如果存在).

所以...你需要这样做才能得到你想要的东西:

select Result      = result.Result ,
       ResultCount = count(field.fieldID)
from      dbo.Results result
left join dbo.Fields field   on field.Results  = result.ID
                            and field.RegionID = @RegionID
group by result.Results
Run Code Online (Sandbox Code Playgroud)

以上将为每个结果提供一行,并指定区域中的匹配字段数(我相信您要求的).对于在指定区域中没有匹配字段的任何结果,计数将为零.