gpt4 book ai didi

sql - 将带有 IN/NOT IN 的 PostgreSQL 查询转换为 JOIN

转载 作者:行者123 更新时间:2023-11-29 14:36:24 31 4
gpt4 key购买 nike

我目前有两个结构相同的表。表 A(作为示例)有 10,000 行,表 B 有 100,000 行。我需要获取表 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)

这行得通,但可能可以使用 JOIN 来完成性能更好的解决方案。我曾尝试这样做,但我得到的只是一个非常庞大的重复行列表。有人能指出我正确的方向吗?

最佳答案

根据您当前的查询,这就是它转换为连接的内容:

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

这将为您提供需要添加到表 B 的行,因为它们未找到。

或者你可以只获取你想要拉过来的字段:

    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

关于sql - 将带有 IN/NOT IN 的 PostgreSQL 查询转换为 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43978780/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com