我尝试连接两个表,以便返回匹配的最深子串。因此,如果我的第一个表有'AAA'和'阿坝',我的第二个表有'A'和'AB',那么连接应该分别返回'A'和'AB'。不幸的是,它返回了三行。我想在不使用多个连接和合并的情况下做到这一点。这就是我的。
With t1 as (
Select 'AAA' as V from dual
Union all
Select 'ABA' as V from dual
)
,t2 as (
Select 'A' as m from dual
Union all
Select 'AB' as m from dual
)
,r1 as (
Select
t1.v
,t2.m
From t1
Left join t2 on
t2.m = Case
When substring(t1.v,1,2) = t2.m
then substring(t1.v,1,2)
When substring(t1.v,1,1) = t2.m
then substring(t1.v, 1,1)
End
)
Select * from r1
不幸的是,我得到重复的阿坝在我的结果
| V| M|
| --|--|
| AAA|一|
| 阿坝|一|
| 阿坝|AB|
我已经尝试了几种不同的方法(在on语句和连接顺序中翻转t1和t2),但没有一种方法能让我得到想要的结果。感谢你的帮助。
3条答案
按热度按时间goucqfw61#
在Oracle 12中,使用
LATERAL
连接,然后使用ORDER BY LENGTH(m) DESC
和FETCH FIRST ROW ONLY
(或FETCH FIRST ROW WITH TIES
)来获得最长的匹配:其输出:
| V| M|
| --|--|
| AAA|一|
| 阿坝|AB|
fiddle
mqxuamgl2#
这只是另一种方法。样本数据有点“差”,所以这取决于你真正拥有的是什么,以及我的建议是否有意义。基本上,你会计算两个字符串之间的 * 距离 *,根据 * 相似性 * 对结果进行排序,并返回最匹配的结果。
样本数据:
查询从这里开始:
7uhlpewt3#
如果你想修改自己的查询,使其工作,那么这是你可以这样做。您看到不需要的行的原因是联接是逐行计算的。为了解决你得到的行只有一个substr字符的问题,对结果进行排名,然后只取最高的排名: