用于排除具有重复字段值的同一表中的行的SQL查询

用于排除具有重复字段值的同一表中的行的SQL查询,sql,Sql,我会尽量简短 我有一个表,我需要从中获取数据,联系人 有一个公司字段,它们可以在公司a或公司B中 公司B中的所有联系人在公司a中都有一个副本,可以与另一列LegacyID匹配 我想得到的是所有A公司的行,B公司中没有具有相同LegacyID的人 我已经尝试过,并且LegacyID不在从Company='B'的联系人中选择LegacyID以及从Company='B'的联系人中选择并且不存在LegacyID 以上两项都不起作用,因为有260000个公司A联系人和96000个公司B。当总共少于5000

我会尽量简短

我有一个表,我需要从中获取数据,联系人

有一个公司字段,它们可以在公司a或公司B中

公司B中的所有联系人在公司a中都有一个副本,可以与另一列LegacyID匹配

我想得到的是所有A公司的行,B公司中没有具有相同LegacyID的人

我已经尝试过,并且LegacyID不在从Company='B'的联系人中选择LegacyID以及从Company='B'的联系人中选择并且不存在LegacyID

以上两项都不起作用,因为有260000个公司A联系人和96000个公司B。当总共少于50000行时,NOT IN和NOT EXISTS起作用,但现在随着数据迁移,查询超时或永远运行


谢谢

如果我理解正确,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'
                 );

为了提高性能,您需要在contactslegacyId、companyId上建立索引。

您应该包括样本数据和数据采集结果。是的,我应该有。我试过了,但是这里的格式使它不可读。所以我可以通过使用GROUPBY来解决这个问题。选择A1.*从tableA A1内部联接中,通过B1.LegacyID=A1.LegacyID和B1.MaxComp=A1.LegacyID上的LegacyID B1从tableA GROUP中选择LegacyID、MAXcompany作为MaxComp。查询在15秒内对所有300000行运行。谢谢大家的帮助。NOT EXISTS不起作用,因为每次它点击NOT EXISTS,它必须通过96000行。因为它做了29万次,所以表现很糟糕。@Enterprenerdz。这就是为什么答案建议建立一个索引。