sql - IN,JOIN或EXISTS用于过滤

时间:2014-09-24 14:02:20

标签: sql inner-join exists sql-in

我有以下两个实体:

project(identifier, name, ...)
member(identifier, name, ...)

他们加入下表:

project-member(project_identifier, member_identifier)

找出某个成员(按标识符)属于哪个项目的最常用方法是什么?我看到三种可能性:

select r1.*
from   project r1
join   project-member r2
       on r2.member_identifier = 3 and r1.identifier = r2.project_identifier;

select *
from   project r1
where  r1.identifier in (select project_identifier from project-member where member_identifier = 3);

select *
from   project r1
where  exists (select * from project-member where member_identifier = 3 and project_identifier = r1.identifier);

我知道它主要取决于数据,并且应该使用真实数据分析查询计划,但我想知道默认选择是什么。我希望它是EXISTS构造,但我希望得到你的意见。

1 个答案:

答案 0 :(得分:0)

正如你所说,它取决于许多未在问题中陈述的因素,但假设正确的索引到位,我相信它们将产生相同或至少非常相似的查询计划,因为它们都是从获取一组特定的来自project-member的行,然后将其连接到项目。

我认为这种变体看起来最自然:

select p.*
from project-member pm
inner join project p on p.identifier = pm.project_identifier
where pm.member_identifier = 3

也就是说,根据您拥有谓词的内容过滤表中的行,然后加入另一个表以获取您实际需要的信息。