我想从一个配置单元表中找到重复的行,我得到了两种方法。
第一种方法是使用以下两个查询:
select count(*) from mytable; // this will give total row count
第二个查询如下,它将给出不同行的计数
select count(distinct primary_key1, primary_key2) from mytable;
使用这种方法,对于我的一个表,使用第一个查询得到的总行数是3500,第二个查询得到的行数是2700。所以它告诉我们 3500 - 2700 = 800
行重复。但是这个查询不会告诉哪些行是重复的。
我找到复制品的第二种方法是:
select primary_key1, primary_key2, count(*)
from mytable
group by primary_key1, primary_key2
having count(*) > 1;
上面的查询应该列出被复制的行以及特定行被复制了多少次。但是这个查询显示零行,这意味着该表中没有重复的行。
所以我想知道:
如果我的第一种方法是正确的-如果是,那么我如何找到哪些行是重复的
为什么第二种方法不提供重复行的列表?
有没有别的办法找到复制品?
3条答案
按热度按时间yhqotfr81#
配置单元不验证主键和外键约束。
由于这些约束未经验证,因此上游系统需要在加载到配置单元之前确保数据完整性。
这意味着配置单元允许主键中的重复项。
要解决您的问题,您应该这样做:
这样您将得到重复行的列表。
vxf3dgd42#
假设您希望基于特定列获取重复行
ID
在这里。下面的查询将为您提供在配置单元的表中重复的所有ID。kmbjn2e33#
分析窗口函数row\ u number()非常有用,可以根据partition by子句中指定的元素提供重复项。然后,一个简单的inline view and exists子句将确定哪些相应的记录集包含原始表中的这些副本。在某些数据库中(如td,可以使用qualify pragma选项放弃内联视图)
sql1和sql2可以合并。sql2:如果您想处理空值而不是简单地消除,那么在将来合并和连接可能会更好
3) 查找所有记录,而不仅仅是>1记录。这提供了所有的上下文数据以及密钥,因此在分析为什么会有dup而不仅仅是密钥时非常有用。