You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:35:17