如何在 Teradata 中一次性从多个表中查找重复记录?

3

数据仓库中有40张表。每天在每日数据加载后,我都会检查这些表是否存在任何数据问题。为了找到重复数据,我使用select查询来实现。

SELECT COALESCE (SUM(DUPS),0) AS DUPS_COUNT, 'PLAYER' AS TABLENAME FROM (Select Count(1) AS DUPS from DW.PLAYER group by PLAYERID having count(1) > 1) A
UNION
SELECT COALESCE (SUM(DUPS),0) AS DUPS_COUNT, 'PlayerBalance' AS TABLENAME FROM (Select Count(1) AS DUPS from DW.PlayerBalance group by PlayerID,SiteID having count(1) > 1) B
UNION
.
.
.
.
.
UNION
SELECT COALESCE (SUM(DUPS),0) AS DUPS_COUNT, 'TABLE40' AS TABLENAME FROM (Select Count(1) AS DUPS from DW.TABLE40 group by PLAYERID having count(1) > 1) AK

一个表的示例输出:

enter image description here

我有用于查找40个表中重复数据的选择查询。所有40个单独的选择语句在逻辑上和语法上都是正确的。但是,我没有逐个运行SQL选择,而是为每个表创建了一个公共格式,并对所有40个选择查询进行了UNION操作。

当运行包含这40个选择查询结合的UNION的查询时,只会显示16张表的输出,而不是40张表。

如何修复才能一次性搜索所有40张表中的重复数据?


1
第一个建议是使用UNION ALL而不是UNION。对于您查询中的值,这不会有问题。但是在实际查询中,您可能会有重复的表名。 - Gordon Linoff
1
TableName列的数据被截断了,行被视为重复。虽然TableName列的值是静态值,但在6个字符后它们被截断了。通过使用UNION ALL,我现在能够看到所有40条记录。 - Teja Goud Kandula
2个回答

3
在Teradata中,第一个Select语句确定结果集的数据类型。'PLAYER'是一个VarChar(6),因此所有较长的名称如'PlayerBalance'将被截断。然后DISTINCT删除了现在的重复名称。
在第一个Select语句中添加CAST('PLAYER' AS VARCHAR(128)) AS TABLENAME(并切换到UNION ALL)。

1
我将扩展我的评论。
每个子查询都将返回一行,无论每个表中有多少个重复项。如果没有重复项,则第一列将为0
因此,应该运行40个查询,返回两列。如何缺少行?明显的罪魁祸首是UNION,因为UNION会删除重复项。对于问题中的示例,第二列是唯一的。但是,如果有任何重复名称,则第一列中的计数可能相同...... voila!由于使用UNION消除重复项而导致行丢失。
我建议用UNION ALL替换UNION。即使这不是一个问题,也没有理由为删除重复项而产生开销。通常情况下,您应该始终使用UNION ALL,除非您想使用UNION - 这大多数时间都是如此。想想您使用SELECT而不是SELECT DISTINCT的频率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接