【问题标题】:SQL join not equal condition returning some equal columnsSQL连接不相等条件返回一些相等的列
【发布时间】:2015-01-13 19:05:07
【问题描述】:

我在同一张表上运行这两个查询。这个查询

SELECT * 
FROM @Table1 t1
JOIN @Table2 t2 ON t1.PersonID = t2.PersonID

返回 300 条记录(两个表都有 300 条记录),不排除值不匹配的记录。

这个查询:

SELECT * 
FROM @Table1 t1
JOIN @Table2 t2 ON t1.PersonID = t2.PersonID AND t1.TestValue <> t2.ReportValue

返回 90 条记录:

第二次查询排除了许多具有相同值但不是全部的记录,它应该只返回 20 条记录。

为什么&lt;&gt; 可以处理某些记录而不能处理其他记录?两列都是浮动的。有什么想法吗?

【问题讨论】:

  • 我的猜测是这些值实际上并不相等,但您是seeing rounded values in the output,所以它们看起来相等。比较浮点数总是有点棘手。您可能希望使用“epsilon”比较而不是直接相等。
  • @M.Ali 和@Kennah Both columns are float
  • 为什么这些列仍然浮动?
  • 那么这是您的问题,Float 是一种虚构/近似数据类型,您提到的这两个值8891,在 Float 数据类型中它们可能代表两个不同的值,这就是您得到的原因他们回来了。使用 DECIMAL 或 NUMERIC 等固定/实数数据类型,您将获得预期的结果。
  • @M.Ali 将列转换为十进制,或将其保留为浮点数并使用 convert(decimal(10,5), d.TestValue) &lt;&gt; convert(decimal(10,5), d2.ReportValue) 修复它。如果您愿意写一个答案,很高兴接受它作为答案。

标签: sql sql-server tsql join sql-server-2012


【解决方案1】:

可能的情况是,您的 PersomID 或 ReportValue/TestValue 列中的至少一个可能是 VARCHAR() 数据类型,而不是 INTEGER 数据类型。如果是 varchar 数据类型,可能其中一些值的末尾包含一个您现在看不到的空格。

因此,如果您的 ReportValue = 8991 AND TestValue = '8991 ',它们将导致条件返回 FALSE。

【讨论】:

    【解决方案2】:

    只需删除 InnerJoin 并执行 Left Join

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-07
      • 2018-06-09
      • 2022-12-18
      • 2018-03-10
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多