我有一个数据库(Oracle)表A,其中一列中包含一些字符串,现在我想从表B中获取与表A的每个列值匹配的记录,例如,
表A
Name
-----------
ABC
DEE
GHI
JKL
表B
Name
-----------
ABC
DEF
GHI
JKL
MNO
PQR
现在,我希望必须对照表B的列检查表A中的每个字符串,如果发现某些字符串几乎相同,则应按照下面的原始值显示它
Table OutPut
Name Matched
--------|----------
ABC | ABC
DEE | DEF
GHI | GHI
JKL | JKL
我尝试了以下查询
with data as(
SELECT Name FROM TABLE_A UNION ALL
SELECT Name FROM TABLE_B
)
SELECT Name
FROM
(
SELECT t.*,utl_match.edit_distance_similarity(upper(Name),upper('DEE')) eds
FROM data t
ORDER BY eds DESC
)
WHERE rownum = 1
但是问题是,使用此查询,我一次只能检查一个记录,而对于硬编码字符串也是如此。有什么方法可以针对表B逐一检查表A中的整个列,并针对每个字符串在输出中产生结果。
答案 0 :(得分:0)
不太聪明(提示:性能问题,但是-看看是否有帮助。如果涉及的行太多,则可以确定。
您需要从第21行开始。
我将相似度设置为大于80-如果需要的话,请对其进行调整(很有可能,因为您发布的数据实际上是样本数据)。
SQL> WITH ta (name)
2 AS (SELECT 'ABC' FROM DUAL
3 UNION ALL
4 SELECT 'DEE' FROM DUAL
5 UNION ALL
6 SELECT 'GHI' FROM DUAL
7 UNION ALL
8 SELECT 'JKL' FROM DUAL),
9 tb (name)
10 AS (SELECT 'ABC' FROM DUAL
11 UNION ALL
12 SELECT 'DEF' FROM DUAL
13 UNION ALL
14 SELECT 'GHI' FROM DUAL
15 UNION ALL
16 SELECT 'JKL' FROM DUAL
17 UNION ALL
18 SELECT 'MNO' FROM DUAL
19 UNION ALL
20 SELECT 'PQR' FROM DUAL)
21 SELECT ta.name,
22 tb.name,
23 UTL_MATCH.jaro_winkler_similarity (ta.name, tb.name) sim
24 FROM ta, tb
25 WHERE UTL_MATCH.jaro_winkler_similarity (ta.name, tb.name) > 80
26 ;
NAM NAM SIM
--- --- ----------
ABC ABC 100
DEE DEF 82
GHI GHI 100
JKL JKL 100
SQL>