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
问题分析
现有语句逻辑错误:
- 表的关联顺序颠倒,LEFT JOIN以子表
d为左表,实际应该以主表c为左表; OR d.[DOCID] IS NULL无意义,左表(子表)的记录不会出现DOCID为NULL的情况(若子表本身存在NULL,也不属于需求范畴);- 最终返回的是子表中没有匹配主表的记录,和需求完全相反。
正确实现方案
方案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
相关产品推荐
相关产品推荐

