SQL join not equal条件返回一些相等的列

SQL join not equal条件返回一些相等的列,sql,sql-server,tsql,join,sql-server-2012,Sql,Sql Server,Tsql,Join,Sql Server 2012,我在同一个表上运行这两个查询。这个问题 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条记录:

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

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条记录


为什么要在一些记录上工作,而不是在其他记录上?两列都是浮动的。有什么想法吗?

可能的是,PersomID或ReportValue/TestValue列中至少有一列可以是VARCHAR数据类型,而不是整数数据类型。如果它是varchar数据类型,则其中一些值可能在末尾包含一个您现在无法看到的空格


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

只需删除InnerJoin并执行Left Join即可。

我的猜测是,这些值实际上并不相等,但您使它们看起来相等。比较浮动总是有点棘手;您可能希望使用epsilon比较而不是直接相等。@M.Ali和@Kennah两列都是float为什么这些列都是float?那么这就是您的问题,float是一种虚构/近似的数据类型,您提到的这两个值8891,在Float数据类型中,它们可能代表两个不同的值,这就是为什么要将它们取回。使用DECIMAL或NUMERIC等固定/实数数据类型,您将返回预期结果。@M.Ali将列转换为十进制,或将其保持为浮点,并使用convertdecimal10,5,d.TestValue convertdecimal10,5,d2.ReportValue将其修复。如果你愿意写一个答案,我很乐意接受。