将具有IN/NOT IN的PostgreSQL查询转换为联接
我目前有两个结构相同的表。例如,表A有10000行,表B有100000行。我需要获得表B中不在表A中的行,但前提是某些字段相同,而一个字段不相同 现在,查询类似于:将具有IN/NOT IN的PostgreSQL查询转换为联接,sql,postgresql,select,join,Sql,Postgresql,Select,Join,我目前有两个结构相同的表。例如,表A有10000行,表B有100000行。我需要获得表B中不在表A中的行,但前提是某些字段相同,而一个字段不相同 现在,查询类似于: select * from tableA A where (A.field1, A.field2) in (select field1, field2 from tableB B) and A.field3 not in (select field3 from B) 这是可行的,但也许可以通过连接实现性能更好的解决方案。我试过
select *
from tableA A
where (A.field1, A.field2) in (select field1, field2 from tableB B)
and A.field3 not in (select field3 from B)
这是可行的,但也许可以通过连接实现性能更好的解决方案。我试过这么做,但我得到的只是一个非常大的重复行列表。有人能给我指出正确的方向吗?根据您当前的查询,这就是它所翻译的连接:
select *
from tableA A
inner join tableB B on A.field1 = B.field1 and A.field2 = B.field2
left outer join tableB C on A.field3 = C.field3
where c.field3 is null
更快的查询是:
select A.pk
from tableA A
inner join tableB B on A.field1 = B.field1 and A.field2 = B.field2
left outer join tableB C on A.field3 = C.field3
where c.field3 is null
group by A.pk
这将为您提供需要添加到tableB的行,因为找不到它们
或者,您也可以只获取要靠边停车的字段:
select A.field1, A.field2, A.field3
from tableA A
inner join tableB B on A.field1 = B.field1 and A.field2 = B.field2
left outer join tableB C on A.field3 = C.field3
where c.field3 is null
group by A.field1, A.field2, A.field3
根据您当前的查询,这就是它转换为连接的内容:
select *
from tableA A
inner join tableB B on A.field1 = B.field1 and A.field2 = B.field2
left outer join tableB C on A.field3 = C.field3
where c.field3 is null
更快的查询是:
select A.pk
from tableA A
inner join tableB B on A.field1 = B.field1 and A.field2 = B.field2
left outer join tableB C on A.field3 = C.field3
where c.field3 is null
group by A.pk
这将为您提供需要添加到tableB的行,因为找不到它们
或者,您也可以只获取要靠边停车的字段:
select A.field1, A.field2, A.field3
from tableA A
inner join tableB B on A.field1 = B.field1 and A.field2 = B.field2
left outer join tableB C on A.field3 = C.field3
where c.field3 is null
group by A.field1, A.field2, A.field3
[不]是你的朋友: 注意:如果联接的列不可为null,[NOT]EXISTS版本的行为将与版本中的[NOT]完全相同 反复阅读问题文本: 我需要获得表B中不在表A中的行,但前提是某些字段相同,而一个字段不相同
[不]是你的朋友: 注意:如果联接的列不可为null,[NOT]EXISTS版本的行为将与版本中的[NOT]完全相同 反复阅读问题文本: 我需要获得表B中不在表A中的行,但前提是某些字段相同,而一个字段不相同
field1和field3条件是不相关的?我想问与@jarlh相同的问题:你确定你当前的查询是正确的吗?表B中可能有重复的,而表A中没有。。。这与您的查询冲突。您是否在某个地方交换了A B?字段1和字段3条件是不相关的?我想问与@jarlh相同的问题:您确定您当前的查询是正确的吗?表B中可能有重复项,但表A中没有。。。这与您的查询冲突。您是否在某个地方交换了A B?如果在field1、field2连接条件上A和B之间有保证的1:1关系,那么这只是一个等价的查询。可能需要选择DISTINCT。依赖于数据。是的,我正在做一个有根据的猜测。这个查询需要很长时间才能运行,并返回大量重复的行。我的查询或@joop的查询按预期工作需要6-7秒。你认为它少了什么?选择一个不同的也需要很长时间。在表A中有id列吗?因为我只需要选择它而不是*并按该列进行分组,这样会更快。如果字段1上的a和B之间有保证的1:1关系,那么这只是一个等价的查询,字段2连接条件。可能需要选择DISTINCT。依赖于数据。是的,我正在做一个有根据的猜测。这个查询需要很长时间才能运行,并返回大量重复的行。我的查询或@joop的查询按预期工作需要6-7秒。你认为它少了什么?选择一个不同的也需要很长时间。在表A中有id列吗?因为我会选择它而不是*并按该列进行分组,这将非常快速谢谢,但不幸的是,此查询与原始查询占用的时间相同。在抱怨性能之前,请先更正您的问题。谢谢,但不幸的是,此查询与原始查询占用的时间相同。在抱怨性能之前,请先更正您的问题。