2013-02-06 1 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 
,536를 반환합니다 내가 믹스에 다음 배제 권한을 던져

지금 :

exclusion_permission 
permission_id 
1 
5 

은 쿼리가 반환됩니다 : 당신이 볼 수 있듯이

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

변경 조인의 순서, 어떤 exclusion_permission가 발견되지 않은 경우에만 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

이것은 원하는 결과를 제공하지 않습니다. –