问题描述
我有名为 “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的所有值的字符串
-检查当前行的值是否在此字符串中。如果他们不是
-将它们添加到 “使用的值” 字符串的末尾
-设置一个标志,指出当前行不在此列表中
-仅返回设置了 “不在列表中” 标志的那些行
把这个放在一起给出了这样的东西:
如果是这样,这里有一种方法可以做到这一点:
-在表上选择一行开始
-递归地处理表中的其余行
-在将行添加到结果时,构建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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




