2014-06-30 1 views
0

Oracle SQL을 사용하고 있습니다. 나는 사람들의 목록을 원하는왼쪽 외부 결합 IN 연산자

People 
PersonID Name 
1   Elmo 
2   Oscar 
3   Chris 

Attribute 
PersonID Attribute 
1   Happy 
1   Muppet 
1   Popular 
2   Grouchy 
2   Muppet 
2   Popular 
3   Programmer 

그리고 나는 우리가 그들을 행복하게 또는 울상 인의 지식을 가지고 있는지 알고 싶어 : 는 여기에 몇 가지 예를 들어 테이블입니다. 나는 노동 조합이 작동합니다 알고

SELECT p.Name, a.Attribute 
FROM People p 
LEFT OUTER JOIN Attributes a 
ON p.PersonID = a.PersonID AND a.Attribute IN ('Happy','Grouchy') 

:이 쿼리를 사용하는 경우

Name  Mood 
Elmo  Happy 
Oscar  null (Happy) 
Chris  null (Happy) 

Elmo  null (Grouchy) 
Oscar  Grouchy 
Chris  null (Grouchy) 

, 그것은 내가 원하는 추가 널 결과 행을 반환하지 않습니다 : 다음은 내가 원하는 출력됩니다. 이것을 할 수있는 다른 방법이 있습니까?

제 게으름, 나는 기존의 질문을 수정했습니다.

+0

:이 cross joinleft join를 사용? –

+0

"IN"상태에있는 각 분위기에 대해 속성 테이블에 대한 조인이 필요합니다. Elmo와 Elmo를 돌려 주면 불가능합니다. NULL – TMNT2014

+0

@ GoatCO 네, 맞습니다. – xenres

답변

2

가능한 모든 행을 생성 한 다음 일치하는 것을 확인해야합니다. 당신은 기분 당 하나의`NULL`도 존재 원하는 말을

select p.name, 
     (case when pm.mood is not null then pm.mood 
      else 'NULL (' || m.mood || ')' 
     end) as mood 
from (select 'Happy' as mood from dual union all 
     select 'Grouchy' from dual 
    ) m cross join 
    (select distinct p.name from people 
    ) p left outer join 
    People pm 
    on pm.name = p.name and pm.mood = p.mood 
order by m.mood, p.name; 
+1

네, 괜찮아 보입니다. http://sqlfiddle.com/#!4/14344/12 –

+0

예, 감사합니다. – xenres