如何简化此SQL查询以选择特定的字符串模式

时间:2017-10-24 19:23:11

标签: sql oracle

我有一张表格如下

表T

V
__
a
ab
abc
abcd
x
xy
xyz
xyzw

我必须得到输出

abcd
xyzw

我写了如下查询 http://sqlfiddle.com/#!4/13c56/10

with x as 
(select t1.v v1, t2.v v2 
   from t t1, t t2 
  where t1.v not like t2.v||'%')
select distinct v1 
  from x x1
 where not exists
       (select 1 
          from x x2 
         where x2.v2 like x1.v1 ||'%'
           and x2.v2 <> x1.v1) 

有没有更好的方法来编写此查询?请分享查询。

1 个答案:

答案 0 :(得分:0)

使用外部联接查找更长类似的序列,然后过滤掉匹配,只留下最长的序列:

select v from
(select t1.v, t2.v v2 
   from t t1
   left join t t2 on t2.v like t1.v || '_%') x
where v2 is null

请参阅SQL Fiddle

请注意在_中使用like(仅指一个字符)在匹配行中至少需要1个字符。

鉴于您的无欺骗示例数据和此逻辑,不需要distinct。但是,如果您有重复的最长序列并且想要重复删除,请添加distinct