【发布时间】: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 条记录。
为什么<> 可以处理某些记录而不能处理其他记录?两列都是浮动的。有什么想法吗?
【问题讨论】:
-
我的猜测是这些值实际上并不相等,但您是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) <> convert(decimal(10,5), d2.ReportValue)修复它。如果您愿意写一个答案,很高兴接受它作为答案。
标签: sql sql-server tsql join sql-server-2012