2014-06-19 2 views
0

내 데이터베이스에서 어떤 사람들이 내 뉴스 레터에서 구독을 취소했는지, 어떤 사람들은 나쁜 전자 메일 주소를 가지고 있는지, 어떤 사람은 없는지 결정하려고합니다. iUnsub과 iBadEmail 모두를위한 활동 활동이 있습니다.잘못된 조인 - 결과 집합 당 1 행

내가 쓴 코드는

select distinct 

n.id, 
'Unsubscribe' = 
      case 
      when a.activity_type = 'iUnsub' then '1' 
      end, 
'Bad Email' = 
      case 
      when a.activity_type = 'iBadEmail' then '1' 
      end 


from name n 
left join activity a on n.id = a.id 


where n.id in 

(
'1002421', 
'1005587', 
'1009073', 
'1001102' 
) 

내가받을 결과는 다음과 같은 각 ID 나에게 하나 개의 행을 줄

id Unsubscribe Bad Email 

1001102 NULL   NULL 

1002421 NULL   NULL 

1002421 1   NULL 

1005587 NULL   NULL 

1005587 1   NULL 

1009073 NULL   1 

1009073 NULL   NULL 

난에 코드 싶습니다 각 ID에 대한 2 개 결과를 생성했다

id Unsubscribe Bad Email 

1001102 NULL NULL 

1002421 1 NULL 

1005587 1 NULL 

1009073 NULL 1 
+0

코드를 검증하는 데 사용할 수있는 입력 데이터의 완전한 작은 예제를 제공하십시오. 이 시점에서 우리가 볼 수있는 것은 코드와 출력물 뿐이며 조인의 위치와 잘못된 작업을 알려주는 것은 아닙니다. –

+0

내부 조인 또는 다른 논리로 시도하면 왼쪽 조인은 항상 결과 집합의 null 값 수를 늘립니다. –

답변

0

문제는 여러 활동 행 3 또는 이름이 있고 각 활동에 대한 결과에서 이름 1001102에는 취소 또는 BadEmail이 아닌 활동이 하나만 있거나 하나만 있습니다.

select n.Id, 
     sum(case when a.activity_id = 'iUnSub' then 1 else 0 end) UnSub, 
     sum(case when a.activity_id = 'iBadEmail' then 1 else 0 end) BadEmail  
from name 
left outer join activity a on n.id = a.id 
where a.activity 
and n.id in 
(
'1002421', 
'1005587', 
'1009073', 
'1001102' 
) 
group by n.Id 

모두 0 인 경우 UnSubbed 또는 BadEmail이, 그리고, 그때는 아마 OK의 경우는 당신에게 비제로 그림을 제공 할 것입니다.

left outer join은 이름에 활동 행이없는 경우를위한 것입니다. 포함시키지 않으면 산출물에 포함되지 않습니다. 괜찮 으면 내부 조인으로 변경하십시오.

+0

도움을 주셔서 대단히 감사드립니다. 이 코드는 a.act를 where 절에서 가져와야했기 때문에 실행되었습니다. – user3372139