Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将具有IN/NOT IN的PostgreSQL查询转换为联接_Sql_Postgresql_Select_Join - Fatal编程技术网

将具有IN/NOT IN的PostgreSQL查询转换为联接

将具有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) 这是可行的,但也许可以通过连接实现性能更好的解决方案。我试过

我目前有两个结构相同的表。例如,表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
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列吗?因为我会选择它而不是*并按该列进行分组,这将非常快速谢谢,但不幸的是,此查询与原始查询占用的时间相同。在抱怨性能之前,请先更正您的问题。谢谢,但不幸的是,此查询与原始查询占用的时间相同。在抱怨性能之前,请先更正您的问题。