为什么我的 SQL Server 查询在面向特定 WHERE 子句 [duplicate] 时返回空记录

Why is my SQL Server Query return empty record when targeting specific WHERE clause [duplicate]

提问人:Abbi KRK 提问时间:5/30/2023 最后编辑:Abbi KRK 更新时间:5/30/2023 访问量:46

问:

我正在使用一些像这样的简单左连接查询

SELECT 
           A.ACCTNO
          ,[ID_Name]
          ,[ID1]
          ,[ID2]
          ,[ID3]
          ,[ID4]
          , A.Value as Value1
          , B.Value AS Value2 FROM TABLE_A A
LEFT JOIN TABLE_B B
ON A.ID_Name = B.ID_Name
AND A.[ID1] = B.[ID1]
AND A.[ID2] = B.[ID2]
AND A.[ID3] = B.[ID3]
AND A.[ID4] = B.[ID4]

令我惊讶的是,一些 Value2 返回 NULL 值。这应该是不可能的,因为并且应该具有相同的确切 ID,唯一不同的是 Value。TABLE_ATABLE_B

在我做了一些采样之后,我在运行这个查询时发现了这一点

select * from TABLE_B
where ID_Name = 13
AND ID1 = 2
AND ID2 = 3
AND ID3 = 3
AND ID4 = NULL

它返回空记录,但是当我省略时,它返回一条记录,这是我期望的记录:ID4

ID_Name HDP系列 高原 高动态范围 HDU型 价值
13 2 3 2 100

所以我的问题是,是什么触发了这一点。为什么如果我包含,它会返回空记录,如果我离开它,它会返回我想要的输出,我该如何避免它?ID4

笔记:

  • 只有 13 个具有 NULL 的 ,其他 的 值为 ,因此无法排除 WHERE 子句ID_NameID4ID_NameID4ID4
  • 不确定是否相关,但我为 varchar(255) 制作了数据类型,以防它检测为文本,因为我使用“import”来填充表,而不是使用查询ID4NULL
  • ID4在源平面文件上保留为 ,而不是BLANKNULL

表结构:

TABLE_A

ID_Name HDP系列 高原 高动态范围 HDU型 价值
13 2 3 2 50
8 1 1 1 1 50

TABLE_B

ID_Name HDP系列 高原 高动态范围 HDU型 价值
13 2 3 2 100
8 1 1 1 1 150

期望输出 :

ID_Name HDP系列 高原 高动态范围 HDU型 值1 值2
13 2 3 2 50 100
8 1 1 1 1 50 150

电流输出 :

ID_Name HDP系列 高原 高动态范围 HDU型 值1 值2
13 2 3 2 50
8 1 1 1 1 50 150
sql-server null 其中子句

评论

0赞 Panagiotis Kanavos 5/30/2023
您使用了,这意味着您期望缺失值。为什么当某些值实际上缺失时,您会感到惊讶?LEFT JOIN ... ON A.ID_Name = B.ID_Name ...
0赞 Brad 5/30/2023
您使用 LEFT JOIN,更改为 INNER JOIN,它将强制记录出现在所有表中。
7赞 AlwaysLearning 5/30/2023
ID4 = NULL在 where 子句中不正确,您正在寻找ID4 IS NULL
0赞 Panagiotis Kanavos 5/30/2023
此外,如果所有条件都为真,则您使用的条件匹配。如果有任何不匹配,则会获得 NULL。如果任一列为 NULL,则存在不匹配。在 SQL 语言中,NULL 表示值未知。如果比较两个未知值,则结果本身是未知的,因此永远不会是真的NULL == NULL
0赞 Abbi KRK 5/30/2023
@PanagiotisKanavos,感谢您对 NULL 的解释,我是否可以引用它以获得我想要的输出?因为我不能仅仅因为一个ID_Name不使用它而很好地排除 ID4。我不能使用内部连接,因为这意味着它将每ID_Name = 13 省略一次。

答: 暂无答案