Teradata舍入错误,设置操作

时间:2016-01-25 21:40:08

标签: sql decimal union teradata

我们正在测试两组之间的差异,并看到在UNION / MINUS操作中进行舍入的一些违反直觉的行为。对此有何解释?

如果仅评估Union语句的第一行(Source - Target),则会出现一个不匹配。这是正确的.-有一个.000005的区别。

但是,如果仅评估第二行,则不会返回任何记录。这意味着当我们进行Target-Source时,Teradata会将这两个数字评估为等效。

此外,当运行整个Union语句时,您会遇到2个不匹配!所以它确实认识到Target-Source也是不同的。

1 + 0 = 2怎么样?也就是说,两组之间联合的基数不应该是基数的总和(忽略重复。)

还附加了另一个例子。

示例描述:

   WITH SOURCE_RESULT(TEST) AS (
   SELECT cast(.0296250 as decimal(10,7))
   ),
   TARGET_RESULT(TEST) AS (
   SELECT cast(.02962 as decimal(10,5))
   )

  ((SELECT * FROM SOURCE_RESULT) MINUS (SELECT * FROM TARGET_RESULT))
  UNION 
  ((SELECT * FROM TARGET_RESULT) MINUS (SELECT * FROM SOURCE_RESULT));

示例2:

   WITH SOURCE_RESULT(TEST) AS (
   SELECT cast(.0843090 as decimal(10,7))
   ),
   TARGET_RESULT(TEST) AS (
   SELECT cast(.08431 as decimal(10,5))
   )

   ((SELECT * FROM SOURCE_RESULT) MINUS (SELECT * FROM TARGET_RESULT))
   UNION 
   ((SELECT * FROM TARGET_RESULT) MINUS (SELECT * FROM SOURCE_RESULT));

1 个答案:

答案 0 :(得分:0)

我相信你在这里看到的奇怪行为可归因于Teradata为了执行集合操作所做的字段转换操作的顺序。

使用MINUS Teradata使用第一组的十进制精度,因此在以下情况下:

source MINUS target

sourcetarget都更改为精度为7,然后MINUS设置操作发生。

当我们这样做时:

target MINUS source

两者都更改为精度5,这导致两个相同的数字,因此我们得到一个空的结果集

到目前为止,这是非常期待的行为。

当我们通过添加UNION使其复杂化时,结果集的十进制精度(以及用于创建它的计算)由左上角查询确定,因此:

source MINUS target
UNION
target MINUS source

所有4个初始字段中的结果更改为十进制精度为7.然后发生两个MINUS集合比较,最后发生UNION。结果是底部MINUS现在与精度7 Decimal进行比较,而.000005差异现在会影响结果。

作为实验,您可以在一个示例中反转UNION,例如:

 WITH SOURCE_RESULT(TEST) AS (
    SELECT cast(.0843090 as decimal(10,7))
   ),
   TARGET_RESULT(TEST) AS (
    SELECT cast(.08431 as decimal(10,5))
   )

  ((SELECT TARGET_RESULT.* FROM TARGET_RESULT) MINUS (SELECT source_result.* FROM SOURCE_RESULT))
  UNION
  ((SELECT SOURCE_RESULT.* FROM SOURCE_RESULT) MINUS (SELECT TARGET_RESULT.* FROM TARGET_RESULT));

我们现在在做什么:

target MINUS source
UNION
source MINUS target

由于所有内容都舍入到精度为5(左上角字段为DECIMAL(10,5)),因此您将得到一个空结果集。