Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Teradata中一次从多个表中查找重复项?_Sql_Teradata - Fatal编程技术网

Sql 如何在Teradata中一次从多个表中查找重复项?

Sql 如何在Teradata中一次从多个表中查找重复项?,sql,teradata,Sql,Teradata,数据仓库中有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(DUP

数据仓库中有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
一个表的示例输出:

我使用select查询查找40个表中每个表的重复项。所有40条select语句在逻辑和语法上都是正确的。但是,我没有一次运行一个sqlselect,而是为每个表创建了一个通用格式,并对所有40个select查询进行了联合

当运行包含40个select查询和一个UNION的查询时,我看到输出仅显示16个表,而不是40个表


如何解决这一问题,以便一次性搜索所有40个表中的重复项?

我将展开我的评论

不管每个表中重复的数量有多大,每个子查询都只返回一行。如果没有DUP,则第一列将为0

因此,应该运行40个查询,返回两列。怎么会缺少行?显而易见的罪魁祸首是联合,因为联合消除了重复项。对于问题中的示例,第二列是唯一的。但是,如果有任何重复的名称,则第一列中的计数可能相同。瞧!由于使用UNION进行重复消除,将丢失行


我建议用UNION ALL代替UNION。即使这不是问题,也没有理由在删除重复项时产生开销。一般来说,您应该始终使用UNIONALL,除非您想使用UNION—这是大多数情况下的情况。想想您使用SELECT而不是SELECT DISTINCT的频率有多高。

在Teradata中,第一个SELECT决定结果集的数据类型。”“玩家”是一个VarChar6,因此所有较长的名称,如“playerbance”都将被截断。然后,DISTINCT将删除现在重复的名称


将演员“PLAYER”作为VARCHAR128作为TABLENAME添加到第一个Select并切换到UNION ALL。

第一个建议是使用UNION ALL而不是UNION。对于查询中的值,不会有问题。但实际查询中可能有重复的表名。表名列中的数据将被修剪,而行将被视为DUP。尽管TableName列的值是静态值,但它们在6个字符后被修剪。通过使用UNION ALL,我现在可以看到全部40条记录。