2013-02-06 57 views
2

这是一个令人困惑的问题,为我写的这么裸露与我。SQL完全外部连接排除,选择非现有的行

我有3个表

section 
id 
name 

permission 
id 
section_id 
name 

exclusion_permission 
permission_id 

查询如下:

SELECT 
    p.id AS permission_id, 
    p.name AS permission_name, 
    s.id AS section_id, 
    s.name AS section_name 
FROM 
    section s 

LEFT OUTER JOIN 
    permission p 
ON 
    p.section_id = s.id 

LEFT OUTER JOIN 
    exclusion_permission lep 
ON 
    lep.permission_id = p.id 

WHERE 
    lep.permission_id IS NULL 

表数据是:

section 
id  name 
1  admin 
2  sales 
3  moderator 
4  intern 

permission 
id  section_id name 
1  1    root 
2  2    sell 
3  2    buy 
4  3    edit_user 
5  3    delete_user 

查询将返回

1, root, 1, admin 
2, sell, 2, sales 
3, buy, 2, sales 
4, edit_user, 3, moderator 
5, delete_user, 3, moderator 
,, 4, intern 

现在,如果我把下面的排斥权限进入组合:

exclusion_permission 
permission_id 
1 
5 

查询将返回:

2, sell, 2, sales 
3, buy, 2, sales 
4, edit_user, 3, moderator 
,, 4, intern 

正如你所看到的,主持人段仍然存在,因为它有一个更与其关联的行。然而,管理部分被删除,因为与它相关联的唯一权限已被排除。我想要做的是让我的查询返回以下内容:

,, 1, admin 
2, sell, 2, sales 
3, buy, 2, sales 
4, edit_user, 3, moderator 
,, 4, intern 

因此,如果该部分没有权限,请显示该部分。另外,如果某个部分的权限全部被排除,仍会显示没有相关权限的部分。

我该怎么做?由于

回答

0

添加这些记录与UNION

... 
UNION 
SELECT NULL, 
     NULL, 
     id, 
     name 
FROM section 
WHERE id NOT IN (SELECT section_id 
       FROM permission 
       WHERE id NOT IN (SELECT permission_id 
            FROM exclusion_permission)) 

SQL Fiddle

0

更改联接顺序,只有加入permission如果没有exclusion_permission发现:

SELECT 
    p.id AS permission_id, 
    p.name AS permission_name, 
    s.id AS section_id, 
    s.name AS section_name 
FROM 
    section s 
LEFT OUTER JOIN 
    exclusion_permission lep 
ON 
    lep.permission_id = s.id 
LEFT OUTER JOIN 
    permission p 
ON 
    p.section_id = s.id 
    AND lep.permission_id IS NULL 

Working example at SQL Fiddle.

+0

这没有给出预期的结果。 –