怎么写这个不存在sql

时间:2016-06-02 22:30:19

标签: sql oracle

功能是主表 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 )

2 个答案:

答案 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
  )
);

如果存在一对多关系,则使用featuresfeature_groups之间的联接可能会产生重复结果。使用EXISTS只返回一行,而一对多连接将返回重复的行。

另一种选择是使用INNOT IN代替EXISTSNOT EXISTS