基于三个复合键筛选某表中另一表不存在的记录
问题:找出NewReports中存在但OldReports中不存在的复合键记录
基于REPORT_ID、USER_ID、CLIENT_ID三个复合键,需要识别出仅存在于NewReports表的记录,预期结果为四条记录:
(2, 3, 2, null)、(4, 4, 1, null)、(7, 2, 2, null)、(8, 1, 2, null)
现有代码的问题分析
- NOT EXISTS写法语法错误:原SQL中
WHERE (IF NOT EXISTS (...))的IF是多余的,不符合SQL语法规范,导致语句无法正确执行。 - LEFT JOIN写法逻辑错误:之前尝试的LEFT JOIN代码中,WHERE条件判断的是
NewReports的字段为null,这完全错误——左连接后,未匹配的记录是OldReports端的字段为null,而非NewReports的字段。
正确解决方案
方案1:修正NOT EXISTS写法
直接使用NOT EXISTS判断复合键是否在OldReports中不存在,语法简单且逻辑准确,适合大数据场景(复合键上有索引时效率更优)。
DROP TABLE IF EXISTS #ReportDifferences SELECT n.REPORT_ID, n.USER_ID, n.CLIENT_ID, n.MY_DATA INTO #ReportDifferences FROM NewReports n WHERE NOT EXISTS ( SELECT 1 FROM OldReports o WHERE n.REPORT_ID = o.REPORT_ID AND n.USER_ID = o.USER_ID AND n.CLIENT_ID = o.CLIENT_ID ) SELECT * FROM #ReportDifferences
方案2:正确的LEFT JOIN写法
通过左连接OldReports,筛选出OldReports端无匹配的记录(即OldReports的字段为null),结果准确且效率可靠。
DROP TABLE IF EXISTS #ReportDifferences SELECT n.REPORT_ID, n.USER_ID, n.CLIENT_ID, n.MY_DATA INTO #ReportDifferences FROM NewReports n LEFT JOIN OldReports o ON n.REPORT_ID = o.REPORT_ID AND n.USER_ID = o.USER_ID AND n.CLIENT_ID = o.CLIENT_ID WHERE o.REPORT_ID IS NULL SELECT * FROM #ReportDifferences
注:如果NewReports中存在复合键重复的记录,可根据需求添加DISTINCT去重。
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

