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

SQL实现查询未匹配员工编号的唯一投诉记录

解决SQL查询重复行并筛选未匹配员工的投诉记录

你的原SQL语句犯了一个常见的错误:它执行了笛卡尔积交叉连接——没有指定任何关联条件就把两张表拼在一起,再筛选employing_nr != nr的结果。这会导致每一条投诉记录和sjofor_db里所有不匹配的员工记录进行组合,自然会出现大量重复行。

下面给你几种高效且正确的写法,都能实现你要的目标:找出krita_db中employing_nr不存在于sjofor_db.nr里的投诉,且每条投诉仅显示一次。

方法1:用NOT EXISTS(推荐,性能最优)

这种写法逻辑最直观,直接检查当前投诉的员工编号在员工表中不存在,数据库优化器也能很好地处理这种查询:

SELECT k.* 
FROM krita_db k
WHERE NOT EXISTS (
    SELECT 1 
    FROM sjofor_db s 
    WHERE s.nr = k.employing_nr
)
ORDER BY k.id DESC;

如果你的krita_db中id是唯一主键,那么每条投诉本身就是唯一的,不需要额外加DISTINCT;如果表中可能存在重复的投诉记录,可以在SELECT后加上DISTINCT来确保结果唯一。

方法2:用LEFT JOIN + IS NULL

通过左连接保留所有投诉记录,然后筛选出没有匹配到员工的那些:

SELECT k.*
FROM krita_db k
LEFT JOIN sjofor_db s ON k.employing_nr = s.nr
WHERE s.nr IS NULL
ORDER BY k.id DESC;

左连接会把krita_db的所有记录都列出来,当sjofor_db中找不到对应的nr时,s.nr会变成NULL,我们只要筛选这个NULL的情况就能得到目标数据。同样,有主键的话不需要DISTINCT,否则可以加上。

方法3:用NOT IN(简洁但有注意事项)

这种写法更简洁,但要注意如果sjofor_db.nr字段存在NULL值,NOT IN会返回空结果,所以一定要加上IS NOT NULL的过滤:

SELECT k.*
FROM krita_db k
WHERE k.employing_nr NOT IN (
    SELECT s.nr 
    FROM sjofor_db s
    WHERE s.nr IS NOT NULL
)
ORDER BY k.id DESC;

推荐优先使用前两种方法,它们在大数据量场景下的性能更稳定,也不会像NOT IN那样有潜在的NULL陷阱。按照上面的写法,你就能得到仅包含id=2、employing_nr=333的那条投诉记录了。

内容的提问来源于stack exchange,提问作者newbees

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:45:39