【问题标题】:SQL Server - Dsiplay all rows from LEFT table even when the condition is not metSQL Server - 即使不满足条件,也显示 LEFT 表中的所有行
【发布时间】:2021-03-18 19:41:24
【问题描述】:

我想获取给定技能 ID 的所有标题和分数,每个技能都有强制性的标题,但答案表中可能没有记录匹配条件 A.[ServiceId] = 45 在这种情况下我仍然需要显示所有的 Titles 和 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作为分数

【问题讨论】:

    标签: sql sql-server join left-join where-clause


    【解决方案1】:

    只需将LEFT JOINed 表上的条件移动到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 不匹配的行将被过滤掉。

    【讨论】:

    • 打败我整整 3 秒 ;)
    • @Larnu:是的,这很接近......仅供参考我已经看到在同一秒内发布了两个答案(那是戈登和我)......
    【解决方案2】:

    您的表上有子句 LEFT JOINWHERE 中,但不处理 NULLs。当表 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];
    

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      相关资源
      最近更新 更多