我会尽量简短。
我有一个表,我需要从Contacts中获取数据。
有一个公司字段,他们可以在公司A或公司B。
公司B中的所有联系人在公司A中都会有副本,可以与另一列LegacyID
匹配。
我想要得到的是所有公司A行中没有公司B中有人具有相同LegacyID
的行。
我已尝试AND LegacyID NOT IN (SELECT LegacyID FROM Contacts WHERE Company = 'B')
以及AND NOT EXISTS (SELECT LegacyID FROM Contacts WHERE Company = 'B')
。
以上工作都没有,因为有26万个公司A联系人和96,000个公司B. NOT IN
和NOT EXISTS
在总行数少于50,000行时工作,但现在有了数据迁移,查询是超时或永远跑步。
由于
答案 0 :(得分:2)
如果我理解正确,NOT EXISTS
应该做你想做的事情:
select c.*
from contacts c
where companyId = 'A' and
not exists (select 1
from contacts c2
where c2.legacyId = c.legacyId and c2.companyId = 'B'
);
为了提高性能,您需要contacts(legacyId, companyId)
上的索引。