功能是主表 feature_groups是一个连接功能和组的连接表 group_orgs另一个连接组和组织的连接表
简单
features
--------
feature_id
name
feature_groups
----------
feature_id
group_id
group_orgs
---------
group_id
org_id
我想找到feature_groups中存在的所有功能,其group_id不存在于group_orgs中。以下似乎有效,但只是想知道这是否是最好的方法。
select f.feature_id
from features f
left join feature_groups fg
on f.feature_id = fg.feature_id
where fg.feature_id is not null
and not exists
( select group_id
from group_orgs gor
where fg.group_id = gor.group_id )
答案 0 :(得分:1)
如果它给你正确的结果并且太慢,那么它可能已经足够好了,但是我会注意到你的LEFT JOIN WHERE x IS NOT NULL
实际上是INNER JOIN
:< / p>
select f.feature_id
from features f
inner join feature_groups fg
on f.feature_id = fg.feature_id
and not exists
( select group_id
from group_orgs gor
where fg.group_id = gor.group_id )
答案 1 :(得分:0)
另一种选择:
SELECT f.feature_id
FROM features f
WHERE EXISTS (
SELECT 'X'
FROM feature_groups fg
WHERE f.feature_id = fg.feature_id
AND NOT EXISTS(
SELECT 'X'
FROM group_orgs gor
WHERE fg.group_id = gor.group_id
)
);
如果存在一对多关系,则使用features
和feature_groups
之间的联接可能会产生重复结果。使用EXISTS
只返回一行,而一对多连接将返回重复的行。
另一种选择是使用IN
和NOT IN
代替EXISTS
和NOT EXISTS
。