我有以下两个实体:
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
构造,但我希望得到你的意见。
答案 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
也就是说,根据您拥有谓词的内容过滤表中的行,然后加入另一个表以获取您实际需要的信息。