T-Sql

為什麼將表與自身進行比較時數據存在差異?TSQL

  • May 7, 2018

我正在比較兩個應該具有相同數據的表。我有幾個不同的查詢應該返回不匹配的行。但是,查詢返回 DO 匹配的行。我不確定為什麼。這是一個例子:

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 compareTempAisfloat和 on compareTempBis decimal,這正是應該發生的情況。

順便說一句,即使兩列都是float,也會發生這種情況,因為這float不是精確的數據類型。

我建議您將數據類型更改為精確的數據類型,例如decimal.

“用於浮點數值數據的近似數字數據類型。浮點數據是近似的;因此,並非數據類型範圍內的所有值都可以精確表示。real 的 ISO 同義詞是 float(24)。” 資料來源: https ://docs.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

引用自:https://dba.stackexchange.com/questions/206031