Oracle:找出SCV_CLIENT_DETAILS中与匹配结果表相似的未收录记录
正确SQL写法:识别漏匹配的客户记录
你的原SQL逻辑错误在于NOT EXISTS子句中的cd.system_client_id <> mr.system_client_id条件——这会导致只要临时表中存在任意一条与当前客户system_client_id不同的记录,该客户就会被选中,完全偏离了需求。
以下是两种符合需求的正确写法:
写法一:使用NOT EXISTS + EXISTS组合
SELECT cd.* FROM scv_client_details cd -- 筛选未收录在临时表中的记录(用qsclient_id作为唯一标识判断) WHERE NOT EXISTS ( SELECT 1 FROM UAT8_MULTIPLEQSID_MATCHRESULTS_20230801 mr WHERE cd.qsclient_id = mr.qsclient_id ) -- 确保临时表中存在性别、生日、姓氏匹配的记录 AND EXISTS ( SELECT 1 FROM UAT8_MULTIPLEQSID_MATCHRESULTS_20230801 mr WHERE cd.sex = mr.sex AND cd.dob = mr.dob AND cd.surname LIKE mr.surname -- 若需精确匹配,替换为 = mr.surname ) ORDER BY cd.qsclient_id;
写法二:使用LEFT JOIN关联
SELECT DISTINCT cd.* FROM scv_client_details cd -- 关联临时表,筛选不在其中的记录 LEFT JOIN UAT8_MULTIPLEQSID_MATCHRESULTS_20230801 mr_in ON cd.qsclient_id = mr_in.qsclient_id -- 关联临时表,匹配性别、生日、姓氏条件 JOIN UAT8_MULTIPLEQSID_MATCHRESULTS_20230801 mr_match ON cd.sex = mr_match.sex AND cd.dob = mr_match.dob AND cd.surname LIKE mr_match.surname WHERE mr_in.qsclient_id IS NULL -- 标记未收录在临时表的记录 ORDER BY cd.qsclient_id;
补充说明
- 用
qsclient_id判断是否在临时表,是因为临时表直接从scv_client_details抽取,该字段应为客户的唯一标识; - 若姓氏需要大小写不敏感的精确匹配,可将姓氏条件改为
UPPER(cd.surname) = UPPER(mr_match.surname); - 写法一通常性能更优,尤其是当临时表针对
qsclient_id、sex、dob、surname建立索引时。
内容的提问来源于stack exchange,提问作者mcquaim
相关产品推荐
相关产品推荐

