-2

我有以下两个实体:

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建筑,但我想听听你的意见。

4

1 回答 1

0

正如您所说,这取决于问题中未说明的许多因素,但假设正确的索引到位,我相信它们会产生相同或至少非常相似的查询计划,因为它们都是从从项目中获取一组特定行开始的-member,然后加入反对项目。

我认为这种变体似乎最自然:

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

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

于 2014-09-24T14:14:44.613 回答