Oracle self join 在同一列中的不同值上复制列值

Oracle self join copying column value over different values in the same column

我正在尝试清理一些几乎重复的数据。我正在执行自连接以查找其中除了一列之外所有列都相等的记录,因此我可以找到最好的重复项以从 table 中删除。我 运行 遇到的问题是,尽管数字记录是正确的,但我只看到其中一个 id 列值一遍又一遍地重复。当我查看与该用户关联的所有值时,id 列值只出现一次重复。

我知道这还不是很清楚,所以希望这会有所帮助。

Id1    ID2    AnotherColumn    AnotherColumn2
---------------------------------------------

1      345       "a"                "bd"
2      345       "a"                "bd"
3      345       "a"                "bd"
4      345       "a"                "bd"
5      345       "a"                "bd"

我想要取回的是您在这个假人中看到的一切 table。我得到的是:

Id1    ID2    AnotherColumn    AnotherColumn2
---------------------------------------------

1      345       "a"                "bd"
1      345       "a"                "bd"
1      345       "a"                "bd"
1      345       "a"                "bd"
1      345       "a"                "bd"

我使用的查询如下所示:

select A.Id1, A.ID2, A.AnotherColumn, A.AnotherColumn2
from dummy_table A, dummy_table B
where A.ID2 = B.ID2
AND A.Id1 <> B.Id1
AND A.AnotherColumn = B.AnotherColumn
AND A.AnotherColumn2 = B.AnotherColumn2

我想知道的是为什么 Id1 的值被复制到其他行而不是实际显示的原始 Id1 值。

我需要一个符合这些条件的 table 中的 ID 列表,因为我必须将它们从包含其他记录的原始 table 中删除符合这些需要保持不变的标准。

我认为这会满足您的要求:

select min(A.id) over (partition by A.ID2, A.AnotherColumn, A.AnotherColumn2) as id,
       A.id2, A.AnotherColumn, A.AnotherColumn2
from dummy_table A;

returns partition by 子句中列组合的最小值 id

当我运行你的查询时,我得到了 20 行;每个 id1 值 4(与 4 x 5 相同,因为您实际上是在进行交叉连接,只排除 a.id1 = b.id1 的行)。

with dummy_table as (select 1 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 2 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 3 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 4 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 5 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual)
select A.Id1, A.ID2, A.AnotherColumn, A.AnotherColumn2
from dummy_table A, dummy_table B
where A.ID2 = B.ID2
AND A.Id1 <> B.Id1
AND A.AnotherColumn = B.AnotherColumn
AND A.AnotherColumn2 = B.AnotherColumn2
order by 1, 2, 3, 4


       ID1        ID2 ANOTHERCOLUMN ANOTHERCOLUMN2
---------- ---------- ------------- --------------
         1        345 a             bd            
         1        345 a             bd            
         1        345 a             bd            
         1        345 a             bd            
         2        345 a             bd            
         2        345 a             bd            
         2        345 a             bd            
         2        345 a             bd            
         3        345 a             bd            
         3        345 a             bd            
         3        345 a             bd            
         3        345 a             bd            
         4        345 a             bd            
         4        345 a             bd            
         4        345 a             bd            
         4        345 a             bd            
         5        345 a             bd            
         5        345 a             bd            
         5        345 a             bd            
         5        345 a             bd

但是,我想知道你是否在寻找类似的东西:

with dummy_table as (select 1 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 2 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 3 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 4 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 5 id1, 345 ID2, 'a' AnotherColumn, 'bd' AnotherColumn2 from dual union all
                     select 6 id1, 345 ID2, 'b' AnotherColumn, 'bd' AnotherColumn2 from dual)
select id1,
       id2,
       anothercolumn,
       anothercolumn2
from   (select id1,
               id2,
               anothercolumn,
               anothercolumn2,
               count(*) over (partition by id2, anothercolumn, anothercolumn2) cnt
        from   dummy_table)
where  cnt > 1;

       ID1        ID2 ANOTHERCOLUMN ANOTHERCOLUMN2
---------- ---------- ------------- --------------
         1        345 a             bd            
         2        345 a             bd            
         3        345 a             bd            
         4        345 a             bd            
         5        345 a             bd 

您可能根本不需要分析函数 - 要删除除具有最低 id1 的行之外的所有行,您可以执行以下操作:

delete from dummy_table
where id1 not in (select min(id1) from dummy_table group by id2, anothercolumn, anothercolumn2);