SQL 服务器 - 即使不满足条件,也显示从左 table 开始的所有行

SQL Server - Dsiplay all rows from LEFT table even when the condition is not met

我想获取给定技能ID的所有标题和分数,每个技能都必须有标题,但答案table中可能没有符合条件A的记录。[ServiceId] = 45 in this如果我仍然需要显示所有标题和 0 作为分数

 SELECT T.[Title] AS 'Title', SUM(A.[Total]) AS 'Score' FROM dbo.[Title] T
    LEFT JOIN dbo.[Answer] A
    ON T.[TitleId] = A.[TitleId]
    WHERE T.[SkillId] = 2 AND A.[TypeId] = 21
    AND A.[ServiceId] = 45
    GROUP BY T.[Title]

为此,我创建了 LEFT Join,但它仍然不显示标题,如果我删除条件 A。[ServiceId] = 45 我会显示标题,但分数不准确

如何在不满足条件A.[ServiceId] = 45的情况下一直显示标题,显示0作为分数

只需将 LEFT JOINed table 上的条件移至 JOINON 子句:

SELECT T.[Title] AS 'Title', SUM(A.[Total]) AS 'Score' FROM dbo.[Title] T
LEFT JOIN dbo.[Answer] A
    ON T.[TitleId] = A.[TitleId] AND A.[TypeId] = 21 AND A.[ServiceId] = 45
WHERE T.[SkillId] = 2 
GROUP BY T.[Title]

如果将条件放在 WHERE 子句中,它们将成为强制条件,并且 LEFT JOIN 不匹配的行将被过滤掉。

您在 table 上有子句,您 LEFT JOINWHERE 中有子句,但不处理 NULL。当没有从 table Answer.

返回行时,A.[TypeId] = 21 永远不会为真

将子句移至 ON:

SELECT T.[Title] AS Title,      --Don't use single quotes for delimited identifying as thet are use
       SUM(A.[Total]) AS Score  --for literal strings and thus can be confusing to read. Use " or []
FROM dbo.[Title] T
     LEFT JOIN dbo.[Answer] A ON T.[TitleId] = A.[TitleId]
                             AND A.[TypeId] = 21
                             AND A.[ServiceId] = 45
WHERE T.[SkillId] = 2
GROUP BY T.[Title];