如何在 Teradata 中一次从多个表中查找重复项?
How to find duplicates from multiple tables at once in Teradata?
数据仓库中有 40 个 table。每日加载后的每一天,我都会检查 table 中是否存在任何数据问题。这是通过使用 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
一个 table 的示例输出:
我有 select 查询来查找 40 个 table 中每个的重复项。所有单独的 40 select 语句在逻辑和句法上都是正确的。但是,我不是一次 运行 一个 SQL select,而是为每个 table 创建了一个通用格式,并为所有 40 [=] 创建了一个 UNION
26=] 个查询。
当此查询包含 40 个 select 查询并结合 UNION 时 运行 然后我看到输出仅显示 16 table 秒而不是 40 tables.
如何解决这个问题,以便一次性搜索所有 40 个 table 以查找重复项?
我要扩展我的评论。
您的每个子查询都将 return 恰好排成一行,而不管每个 table 中的重复项数。如果没有重复,第一列将是 0
。
因此,40 个查询应该 运行 returning 两列。行怎么会丢失?明显的罪魁祸首是 UNION
,因为 UNION
删除了重复项。对于问题中的示例,第二列是唯一的。但是,如果有任何重复名称,则第一列中的计数可能相同。 . .瞧!由于使用 UNION
.
进行重复消除,行将丢失
我建议用 UNION ALL
替换 UNION
。即使这不是问题,也没有理由产生删除重复项的开销。一般来说,你应该总是使用 UNION ALL
,除非你想使用 UNION
—— 大多数时候都是这样。想一想您使用 SELECT
而不是 SELECT DISTINCT
的频率有多高。
在 Teradata 中,第一个 Select 确定结果集的数据类型。 'PLAYER' 是一个 VarChar(6),因此所有较长的名称如 'PlayerBalance' 将被截断。然后 DISTINCT 删除现在重复的名称。
将 CAST('PLAYER' AS VARCHAR(128)) AS TABLENAME
添加到第一个 Select(并切换到 UNION ALL)。
数据仓库中有 40 个 table。每日加载后的每一天,我都会检查 table 中是否存在任何数据问题。这是通过使用 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
一个 table 的示例输出:
我有 select 查询来查找 40 个 table 中每个的重复项。所有单独的 40 select 语句在逻辑和句法上都是正确的。但是,我不是一次 运行 一个 SQL select,而是为每个 table 创建了一个通用格式,并为所有 40 [=] 创建了一个 UNION
26=] 个查询。
当此查询包含 40 个 select 查询并结合 UNION 时 运行 然后我看到输出仅显示 16 table 秒而不是 40 tables.
如何解决这个问题,以便一次性搜索所有 40 个 table 以查找重复项?
我要扩展我的评论。
您的每个子查询都将 return 恰好排成一行,而不管每个 table 中的重复项数。如果没有重复,第一列将是 0
。
因此,40 个查询应该 运行 returning 两列。行怎么会丢失?明显的罪魁祸首是 UNION
,因为 UNION
删除了重复项。对于问题中的示例,第二列是唯一的。但是,如果有任何重复名称,则第一列中的计数可能相同。 . .瞧!由于使用 UNION
.
我建议用 UNION ALL
替换 UNION
。即使这不是问题,也没有理由产生删除重复项的开销。一般来说,你应该总是使用 UNION ALL
,除非你想使用 UNION
—— 大多数时候都是这样。想一想您使用 SELECT
而不是 SELECT DISTINCT
的频率有多高。
在 Teradata 中,第一个 Select 确定结果集的数据类型。 'PLAYER' 是一个 VarChar(6),因此所有较长的名称如 'PlayerBalance' 将被截断。然后 DISTINCT 删除现在重复的名称。
将 CAST('PLAYER' AS VARCHAR(128)) AS TABLENAME
添加到第一个 Select(并切换到 UNION ALL)。