暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何删除单个表的两个不同列中的重复记录。

askTom 2017-03-28
160

问题描述

我有名为 “DUPLICTAE” 的表格,其中包含以下记录。我需要以下期望的输出...

COL1     |  COL2
:-----    | -----:
banglore  | chennai
kolkata   | pune
chennai   | mysore
pune   | banglore
mysore   | kolkata
mumbai   | delhi

=================================


EXPECTED OUTPUT:-

BANGALORE | CHENNAI
KOLKATTA  | PUNE
MUMBAI    | DELHI
复制

专家解答

所以你想只显示行,所以每个值在整个结果集中最多出现一次?因此,如果 “banglore” 在col1中,则不能在col1或col2中显示任何其他行?

如果是这样,这里有一种方法可以做到这一点:

-在表上选择一行开始
-递归地处理表中的其余行
-在将行添加到结果时,构建c1和c2的所有值的字符串
-检查当前行的值是否在此字符串中。如果他们不是
-将它们添加到 “使用的值” 字符串的末尾
-设置一个标志,指出当前行不在此列表中
-仅返回设置了 “不在列表中” 标志的那些行

把这个放在一起给出了这样的东西:

create table t (
  c1 varchar2(10),
  c2 varchar2(10)
);

insert into t values ('banglore','chennai');
insert into t values ('kolkata','pune');
insert into t values ('mysore', 'chennai');
insert into t values ('pune','banglore');
insert into t values ('mysore','kolkata');
insert into t values ('mumbai','delhi');
insert into t values ('delhi', 'pune');

with ranks as (
  select t.*,
         c1 || ':' || c2 str,
         row_number() over (order by c1, c2) rn
  from   t
), dedup (c1, c2, str, rn, strs, lev, ins) as (
  select c1, c2, str, rn, str, 1 lev, 'N' ins from ranks where rn = 1
  union all
  select r.c1, r.c2, r.str, r.rn, 
         case 
           when instr(d.strs, r.c1) = 0 and instr(d.strs, r.c2) = 0 then d.strs || ':' || r.str
           else d.strs 
         end strs,
         d.lev + 1 d,
         case 
           when instr(d.strs, r.c1) = 0 and instr(d.strs, r.c2) = 0 then 'N' 
           else 'Y'
         end ins
  from dedup d
  join ranks r
  on   d.lev + 1 = r.rn 
)
  select * from dedup
  where  ins = 'N';
  
C1        C2       STR               RN  STRS                                        LEV  INS  
banglore  chennai  banglore:chennai  1   banglore:chennai                            1    N    
delhi     pune     delhi:pune        2   banglore:chennai:delhi:pune                 2    N    
mysore    kolkata  mysore:kolkata    6   banglore:chennai:delhi:pune:mysore:kolkata  6    N
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论