Sql 如何使用复合主键ORACLE消除表中的重复行

Sql 如何使用复合主键ORACLE消除表中的重复行,sql,oracle,row,Sql,Oracle,Row,我需要从表中找到重复的行,其中前三列将构成主键。然后,在找到重复的行之后,需要从查询结果中删除这些重复的行,如本例所示: 给这张桌子。前3列作为主键 --------------1 2 3 4 5 6-----------------------------------------------------------------------------------------------------------------------1 2 3 9 8 9--------------------

我需要从表中找到重复的行,其中前三列将构成主键。然后,在找到重复的行之后,需要从查询结果中删除这些重复的行,如本例所示: 给这张桌子。前3列作为主键

--------------1 2 3 4 5 6-----------------------------------------------------------------------------------------------------------------------1 2 3 9 8 9-----------------------------------------------------------------------------------------------------------------------1 4 3 9 89-------------------------------------------------------------------------------------------------------------------------------3 4 2 2 2 1-------------------------------------------------------------------------------------------------------------------------------2 3 4 1 1 3-----------------------------------------------------------------------------------------------2 3 4 9 0--------

因为123是复合主键。前两行应视为重复,因此应从结果中删除。就像两排2 3 4一样。 结果集中只有以下行:

143989和34221

你能帮忙吗


非常感谢您的提问。

您的问题没有充分的意义。复合主键可以防止表中出现重复项。因此,如果数据包含重复项,则这些列不会声明为共站点主键

如果每个组只有一行,可以使用
row\u number()
这样做(列名显然无效):

如果要删除额外的行,可以尝试:

delete from t
    where rowid not in (select min(rowid) from table t group by 1, 2, 3);
编辑:

如果要删除重复行的情况,则需要
count()
而不是
row\u number()


如果您将列声明为复合主键,则Oracle将不允许插入重复项。我猜OP希望装箱一个复合主键,但不能,因为存在重复项。您是对的,它未声明为复合主键。。我们只是“好像”用它。。但它没有声明。请正确格式化示例数据。好的,它不是主键。。很抱歉给你添麻烦。。它们被“用作”行的非正式标识。。但它们不是主键。剩下的是sameI不希望每组有一行。在第1、2和3列上具有重复且匹配值的每一行都需要从查询结果中取出。此外,我不需要从表中删除行。。仅根据查询中的结果。
delete from t
    where rowid not in (select min(rowid) from table t group by 1, 2, 3);
select t.*
from (select t.*, count() over (partition by 1, 2, 3) as cnt
      from table t
     ) t
where cnt > 1;