為什麼將表與自身進行比較時數據存在差異?TSQL
我正在比較兩個應該具有相同數據的表。我有幾個不同的查詢應該返回不匹配的行。但是,查詢返回 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
compareTempA
isfloat
和 oncompareTempB
isdecimal
,這正是應該發生的情況。順便說一句,即使兩列都是
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