使用Left Join时,避免在GROUP BY子句中指定每个表字段

Cla*_*tin 4 sql sql-server group-by count left-join

我有一个简单的SQL Server 2008数据库,有两个表,如下所示:

TableA: 
    (PK)"ID"
    "Field"
Run Code Online (Sandbox Code Playgroud)

TableB:
    (PK)"ID"
    (FK)"ID_TableA"
    "Field"
Run Code Online (Sandbox Code Playgroud)

我想选择所有字段TableA以及TableB每行中有多少对应的行TableA:

SELECT A.*, 
       COUNT(B."ID") as "B's number"
FROM "TableA" A
LEFT JOIN "TableB" B ON (A."ID" = B."ID_TableA")
GROUP BY A."ID", A."Field"
Run Code Online (Sandbox Code Playgroud)

这很好用,但我有这个问题:如果TableA进一步修改(假设我们必须添加另一Field2列),我必须更新SELECT上面的语句,在GROUP BY子句中包含该字段.否则我在执行操作时收到此错误:

" 列'TableA.Field2'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中 "

有没有办法避免这种情况,所以我可以修改我,TableA而不是像上面那样更新所有语句?

ype*_*eᵀᴹ 5

你可以使用它(表B中的第一个Group By,然后是表A的Join):

SELECT A.*, 
       COALESCE("B's number", 0) AS "B's number"
FROM "TableA" A
  LEFT JOIN 
    ( SELECT B."ID_TableA", COUNT(B."ID") as "B's number"
      FROM "TableB" B 
      GROUP BY B."ID_TableA"
    ) AS B ON (A."ID" = B."ID_TableA")
Run Code Online (Sandbox Code Playgroud)