Oracle -查找表中与另一个表中的行相似的行

3lxsmp7m  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(90)

我正在Oracle中编写一个批处理作业,它旨在匹配重复的客户端并为它们提供相同的ID。我写了这篇文章,它似乎工作得很好。
我现在试图识别表中的记录,这些记录可能也得到了匹配。
我创建了一个临时表,提取了匹配在一起的记录:

CREATE TABLE UAT8_MultipleQSID_MatchResults_20230801 AS (
select CAST(NULL AS NUMBER)  NEW_QSCLIENT_ID, cd.*
  from scv_client_details cd
 where cd.qsclient_id in
       (select distinct cd1.qsclient_id
          from scv_client_details cd1
         where cd1.match_details like 'Matched with multiple QSIDs%'));

字符串
我现在想要获取的是SCV_CLIENT_DETAILS中的任何记录,其中SEX相同,DOB相同,SURNAME类似于UAT8_MultipleQSID_MatchResults_20230801中已有的记录,但该记录不在上表中。
我不知道该怎么写,有什么想法吗?
我试着写这样的东西,但它没有给我我需要的东西:

select *
  from scv_client_details cd
 where not exists (select *
          from UAT8_MULTIPLEQSID_MATCHRESULTS_20230801 mr
         where cd.sex = mr.sex
           and cd.dob = mr.dob
           and cd.surname like mr.surname
           and cd.system_client_id <> mr.system_client_id)
order by cd.qsclient_id;


谢了,麦克

o3imoua4

o3imoua41#

我想性别和出生日期是没有问题的;我们不知道你的数据,所以 * 也许 * 你应该申请例如。upper函数到sex或truncdob
然而,姓氏是另一个故事。这几乎肯定是错误的:

and cd.surname like mr.surname

字符串
因为你这样说的话,就跟你用cd_surname = mr.surname是一样的。有几种选择你可以尝试;以下是其中一些。
示例表(我在比较同一个表中的两个姓氏;当然,你会在不同的表中比较它们)。

SQL> select * from test;

        ID SURNAME_1  SURNAME_2
---------- ---------- ----------
         1 Donkey     Key
         2 Foot       Feet
         3 King       Kong
         4 Scott      Scott

选项1:带通配符的like运算符:

SQL> select *
  2  from test
  3  where upper(surname_1) like '%' || upper(surname_2) || '%';

        ID SURNAME_1  SURNAME_2
---------- ---------- ----------
         1 Donkey     Key
         4 Scott      Scott

SQL>

选项二soundex功能:

SQL> select *
  2  from test
  3  where soundex(surname_1) = soundex(surname_2);

        ID SURNAME_1  SURNAME_2
---------- ---------- ----------
         2 Foot       Feet
         3 King       Kong
         4 Scott      Scott

选项3instr功能:

SQL> select *
  2  from test
  3  where instr(upper(surname_1), upper(surname_2)) > 0;

        ID SURNAME_1  SURNAME_2
---------- ---------- ----------
         1 Donkey     Key
         4 Scott      Scott

选项4:相似性:

SQL> select t.*,
  2    utl_match.jaro_winkler_similarity(surname_1, surname_2) sim
  3  from test t;

        ID SURNAME_1  SURNAME_2         SIM
---------- ---------- ---------- ----------
         1 Donkey     Key                 0
         2 Foot       Feet               70
         3 King       Kong               85
         4 Scott      Scott             100


现在您已经知道两个值的相似程度,请将阈值设置为您认为合适的值,例如。90%:

SQL> select *
  2  from test
  3  where utl_match.jaro_winkler_similarity(surname_1, surname_2) > 90;

        ID SURNAME_1  SURNAME_2
---------- ---------- ----------
         4 Scott      Scott

SQL>

相关问题