不正确的连接 - 每个结果集1行

时间:2014-06-19 08:42:12

标签: sql merge windows-server-2003

我试图确定我的数据库中的哪些人要么取消订阅我的新闻信件,哪些人有错误的电子邮件地址,哪些人也没有。我有iUnsub'和'iBadEmail'的活动。

我写的代码是

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创建2个结果

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给我一行,如下所示

id  Unsubscribe Bad Email

1001102 NULL    NULL

1002421 1   NULL

1005587 1   NULL

1009073 NULL    1

1 个答案:

答案 0 :(得分:0)

问题是您有多个活动行3或您的名字,并且您在每个活动的结果中返回一行。名称1001102要么没有,要么只有一个既不是Unsub也不是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

如果UnSubbed或BadEmail,这将给你一个非零数字,如果两者都是0,那么它可能是正确的。

left outer join适用于名称没有活动行的情况。如果您不包含它,那么它们将不会包含在输出中。如果没问题,请将其更改为内部联接。