我正在比较两个应该具有相同数据的表。我有几个不同的查询应该返回不匹配的行。但是,查询会返回匹配的行。我不确定为什么。这是一个例子:
select
which = 'TableA',
*
from (
select * from compareTempA
except
select * from compareTempB
) x
union all
select
'TableB',
*
from (
select * from compareTempB
except
select * from compareTempA
) x
order by dateindex, empid, serviceSales, productSales
出于某种原因,我得到如下结果:
如您所见,这些行似乎是匹配的。我也试过:
select sum(case when A.productSales = B.productSales then 0 else 1 end) from
compareTempA A
join compareTempB B
on A.dateindex = B.dateindex
and A.empid = B.empid
and A.storeid = B.storeid
我得到 3011。我很困惑,因为两个表中的数据应该是相同的。我唯一能想到的是,我通过以下方式插入到每个表中来形成两个表:
insert into compareTempA
select * from someView
我对 compareTempB 也做了同样的事情。我尝试先截断表格并重新插入。请帮忙!
我唯一想到的是,您没有
productSales
对两个表的列使用相同的数据类型。例如,如果您的数据类型 on
compareTempA
isfloat
和 oncompareTempB
isdecimal
,那正是应该发生的情况。顺便说一下,即使两列都是
float
,也会发生这种情况,因为它float
不是精确的数据类型。我建议您将数据类型更改为精确的数据类型,例如
decimal
.“用于浮点数字数据的近似数字数据类型。浮点数据是近似的;因此,并非数据类型范围内的所有值都可以准确表示。实数的 ISO 同义词是 float(24)。” 来源: https ://learn.microsoft.com/en-us/sql/t-sql/data-types/float-and-real-transact-sql?view=sql-server-2017
类似问题:
同样的问题在这里 - https://stackoverflow.com/questions/16149966/comparing-2-float-values-in-sqlserver
红门最佳实践 - https://documentation.red-gate.com/codeanalysis/best-practice-rules/bp023
关于浮点数和精确比较的另一个问题 - https://stackoverflow.com/questions/10737004/should-we-use-float-as-primary-key-in-sql-server