跨数据库引擎用OUTER APPLY查不匹配记录遇执行停滞,求解决方案
你当前的OUTER APPLY语句没加关联条件,相当于对两个表做笛卡尔积,数据量大的话自然跑不完。要找出DB_1.[dbo].[Records_Overview](别名M)中records列存在,但DB_2.[dbo].[Records_Individual](别名C)中records列不存在的记录,试试下面几种可行方法:
方法1:正确使用LEFT JOIN
这是最直观的写法,先关联两表的records列,再过滤掉C表能匹配到的记录(即C表records为NULL的行):
SELECT M.records FROM [DB_1].[dbo].[Records_Overview] M LEFT JOIN [DB_2].[dbo].[Records_Individual] C ON M.records = C.records WHERE M.record_Type = 'individual' AND C.records IS NULL;
如果之前LEFT JOIN没得到预期结果,大概率是没加C.records IS NULL这个过滤条件,或者关联条件写错了。
方法2:使用NOT EXISTS(推荐,性能更优)
当C表的records列有索引时,NOT EXISTS的查询效率通常比LEFT JOIN更高,逻辑也更贴合需求:
SELECT M.records FROM [DB_1].[dbo].[Records_Overview] M WHERE M.record_Type = 'individual' AND NOT EXISTS ( SELECT 1 FROM [DB_2].[dbo].[Records_Individual] C WHERE C.records = M.records );
这个写法直接检查M的每条records在C中是否不存在,逻辑和需求完全匹配。
方法3:使用NOT IN(注意NULL陷阱)
如果C表的records列不存在NULL值,可以用NOT IN,但如果有NULL,这个查询会返回空结果,必须谨慎使用:
SELECT M.records FROM [DB_1].[dbo].[Records_Overview] M WHERE M.record_Type = 'individual' AND M.records NOT IN ( SELECT C.records FROM [DB_2].[dbo].[Records_Individual] C WHERE C.records IS NOT NULL -- 必须加此过滤,避免NULL干扰结果 );
额外建议:先确认两个表的records列数据类型是否一致,类型不匹配会导致隐式转换,影响查询性能和结果准确性;同时检查C表的records列是否有索引,没有的话创建非聚集索引能大幅提升查询速度。
内容的提问来源于stack exchange,提问作者Pauli du Plooy
相关产品推荐
相关产品推荐

