выберите соответствующую строку из другого оракула таблицы - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть база данных (Oracle) Таблица A с несколькими строками в одном из столбцов. Теперь я хочу получить соответствующие записи из таблицы B для каждого значения столбца таблицы A, например,

Таблица A

Name
-----------
ABC
DEE
GHI
JKL

Таблица B

Name
-----------
ABC
DEF
GHI
JKL
MNO
PQR

Теперь я хочу, чтобы каждая строка в таблице A была проверена по столбцу таблицы B, и если какая-либо строка была найдена почти идентичной, то она должна отображаться с исходным значением, как показано ниже

Таблица 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

но проблема в том, что с помощью этого запроса я могу проверять только одну запись за раз, и это тоже по жестко закодированной строке. Есть ли способ проверить весь столбец из таблицы A один за другим против таблицы B и вывести результат для каждой строки.

1 Ответ

0 голосов
/ 07 ноября 2018

Не слишком умно (подсказка: проблема с производительностью, но - посмотрите, поможет ли это. Может быть, все в порядке, если не слишком много строк.

Вам нужны строки 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...