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

SQL查询求助:获取主表中不存在于子表的数据

SQL查询问题:获取主表中不存在于子表的条目

场景说明

  • 主表:Custom_SUAM_Content(TABLE 1,包含完整数据集)
  • 子表:Custom_SUAM_Docuware(TABLE 2,仅为主表的子集)
  • 需求:查询主表中不存在于子表的条目

现有错误语句

当前无法实现预期效果的SQL语句:

SELECT c.[DOC_ID], d.[DOCID]
FROM [dbo].[Custom_SUAM_Docuware] d 
    LEFT JOIN [dbo].[Custom_SUAM_Content] c ON (c.[DOC_ID] = d.[DOCID])
WHERE c.[DOC_ID] IS NULL
    OR d.[DOCID] IS NULL

问题分析

现有语句逻辑错误:

  1. 表的关联顺序颠倒,LEFT JOIN以子表d为左表,实际应该以主表c为左表;
  2. OR d.[DOCID] IS NULL无意义,左表(子表)的记录不会出现DOCID为NULL的情况(若子表本身存在NULL,也不属于需求范畴);
  3. 最终返回的是子表中没有匹配主表的记录,和需求完全相反。

正确实现方案

方案1:LEFT JOIN 筛选不匹配记录

以主表为左表关联子表,筛选子表无匹配的记录:

SELECT c.[DOC_ID]
FROM [dbo].[Custom_SUAM_Content] c
LEFT JOIN [dbo].[Custom_SUAM_Docuware] d 
    ON c.[DOC_ID] = d.[DOCID]
WHERE d.[DOCID] IS NULL

方案2:NOT EXISTS(推荐,性能更优)

通过子查询检查主表记录是否在子表中存在,不存在则保留:

SELECT c.[DOC_ID]
FROM [dbo].[Custom_SUAM_Content] c
WHERE NOT EXISTS (
    SELECT 1
    FROM [dbo].[Custom_SUAM_Docuware] d
    WHERE d.[DOCID] = c.[DOC_ID]
)

方案3:NOT IN(需注意NULL值)

若子表DOCID无NULL值,可使用NOT IN;若有NULL,必须添加IS NOT NULL过滤,否则会返回空结果:

SELECT c.[DOC_ID]
FROM [dbo].[Custom_SUAM_Content] c
WHERE c.[DOC_ID] NOT IN (
    SELECT d.[DOCID]
    FROM [dbo].[Custom_SUAM_Docuware] d
    WHERE d.[DOCID] IS NOT NULL
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:06:25