我们正在测试两组之间的差异,并看到在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));
答案 0 :(得分:0)
我相信你在这里看到的奇怪行为可归因于Teradata为了执行集合操作所做的字段转换操作的顺序。
使用MINUS
Teradata使用第一组的十进制精度,因此在以下情况下:
source MINUS target
source
和target
都更改为精度为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)
),因此您将得到一个空结果集。