从另一个表中选择匹配的字符串

时间:2018-11-07 11:07:16

标签: oracle

我有一个数据库(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中的整个列,并针对每个字符串在输出中产生结果。

1 个答案:

答案 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>