【发布时间】:2015-08-01 21:07:19
【问题描述】:
我有一张表 DB_Budget,它有 3 列 Business_Unit_Code、Ledger_Period、Budget_GBP。为简单起见,我省略了其他列。
数据类型是 -
此表存在于我的开发和生产环境中。
在进行一些质量检查时,我运行了以下查询:
select
Business_Unit_Code,
Ledger_Period,
Budget_GBP
from [SomeLinkedServer].[Database].dbo.DB_BUDGET
where business_unit_code = 'AV' and ledger_period = '200808'
and budget_gbp >= 32269
except
select
Business_Unit_Code,
Ledger_Period,
Budget_GBP
from [Database].dbo.DB_BUDGET
where business_unit_code = 'AV' and ledger_period = '200808'
and budget_gbp >= 32269
我明白了 -
如果我删除了例外,这就是我得到的 -
显然,两个表中的数据相同!为什么EXCEPT 会给我一排?
事情变得有趣。我将Budget_GBP 包裹在LTRIM(RTRIM( ... 构造周围。
和事情匹配!
我做了一点googling 并发现LTRIM(RTRIM( 基本上将浮点数四舍五入到32269.2。这可能是它们匹配的原因。
所以,总而言之,我的第一个问题是为什么EXCEPT 在记录匹配时会在结果中显示一行?
我的第二个问题可能很简单。如您所见,我被限制在WHERE 子句中使用子句budget_gbp >= 32269。原因是当我提供确切的值(我从 SSMS 复制)时,我没有得到任何结果。请让我知道我在这里做错了什么。
编辑 - 有什么方法可以进行数据验证吗?数据库中有 100 个表,我几乎不可能清除浮动列并将它们包裹在演员表中。使用 EXCEPT 是在开发环境中验证数据的一种方法。
【问题讨论】:
-
@dnoeth 当然,问题是像“预算”这样的字段真的应该是近似值。
-
@Conrad Frix:是的,因此应该考虑切换到确切的数字:-)
-
正如@dnoeth 所暗示的,您是否使用
number或decimal类型来存储Budget_GBP值?如果不是,您可能会使用类似于科学记数法存储/计算的浮点数,您可能会在其中发生意想不到的事情。另一种可能性是字符串值可能在值的末尾有一个空格。例如,Ledger_Period实际上可能是200808。您还可以尝试检查值的长度——我有一个不可见的字符存储在 varchar 字段中的情况。它看起来像一个空字符串,但将其与 '' 进行比较总是错误的。 -
如果您完整阅读我的问题,您会看到,该字段是
float。我对unexpected things happen部分感兴趣。 -
@dnoeth - 很好的链接(虽然我不擅长数学!)让我看到了指向 Dhahran 失败
http://en.wikipedia.org/wiki/MIM-104_Patriot#Failure_at_Dhahran的 wiki 链接。让我欣赏我们所做的工作。
标签: sql sql-server except