2016-04-29 47 views
0

任何人都可以帮助我弄清楚我在做这个查询有什么问题。我试图从表中包含发送给客户端的电子邮件的一些记录与电子邮件的状态。我需要消除状态为已发送(1)和退回(0)的所有EmailId。除了这两种状态以外的任何情况均视为已交付(4)。因此,输出仅包含EmailId,状态为Delivery(4),表示状态为1和0的所有EmailId。在下面的示例中,我也应该看到EmailId 4,状态为DeliveredT-SQL集合查询

这是我的样本集up.Really感谢所有帮助你们能给我提供

create table #status 
(
    Id int, 
    Name varchar(100) 
) 

insert into #status (Id, Name) 
values (0, 'Bounced'), (1, 'Sent'), (2, 'Clicked'), 
     (3, 'Opened'), (4, 'Delivered') 

create table #email 
(
    EmailId int , 
    Email varchar(100), 
    StatusId int 
) 

insert into #email (EmailId, email, StatusId) 
values (1, '[email protected]', 1), (1, '[email protected]', 0), 
     (2, '[email protected]', 1), (2, '[email protected]', 2), 
     (2, '[email protected]', 3), (3, '[email protected]', 1), 
     (3, '[email protected]', 2), (3, '[email protected]', 3), 
     (4, '[email protected]', 1) 

select 
    e.EmailId 
into 
    #temp 
from 
    #email e 
inner join #status st 
    on st.Id = e.StatusId 
where 
    (e.StatusId not in (1,0)) 
group by 
    e.EmailId 

drop table #temp 
drop table #email 
drop table #status 
+0

我很困惑。这似乎是一个非常简单的要求,但带有不必要的复杂解决方案。您有多个SELECT语句返回三个单独的结果集。如果您只是试图过滤出0和1个状态,那么您已经在第一个SELECT查询中这样做了(除了将这些行插入临时表中,因此您从不会看到它们)。 –

+0

@ Boyd,我刚刚摆脱了我有的额外选择语句。我试图消除任何具有0和1 statusIds的EmaiId。除了那些应该在一列中显示EmailId和状态交付(4) )在下一列(没有重复EmailIds)。我没有看到EmailId 4与我的聚合查询 –

+0

啊,我明白了。您没有看到EmailID 4的原因是因为您使用WHERE e.StatusId NOT IN(1,0)进行过滤。这是一个OR语句,基本上说“statusID不是1或0”。我会发布一个答案。 –

回答

2

这是种缺憾的方式来获得这个(你可以做到这一点没有临时表,但我这样做,在这里遵循你自己的语法)。第一个查询抓住它匹配1和0的第二查询返回不第一个查询存在于电子邮件ID行:

SELECT EmailID 
INTO #temp 
FROM #email 
WHERE StatusID = 0 
AND EXISTS (SELECT 1 FROM #email WHERE StatusID = 1) 

SELECT DISTINCT e.EmailID 
FROM #email AS e LEFT JOIN #temp AS t 
ON e.EmailID = t.EmailID 
WHERE t.EmailID IS NULL 

BTW:该SELECT 1 FROM ...不会有什么关系与StatusID#1。这可能看起来很混乱,因为我使用了SELECT 1,但它可能是SELECT 5或SELECT'Z'。这几乎毫无意义。

这里有没有临时表相同的查询:通过您正试图完成什么

SELECT DISTINCT e.EmailID 
FROM #email AS e 
WHERE e.EmailID NOT IN (
    SELECT EmailID 
    FROM #email 
    WHERE StatusID = 0 
    AND EXISTS (SELECT 1 FROM #email WHERE StatusID = 1) 
) 
+0

,非常感谢。我有这个查询的出发点来解决我的大问题。真的很感谢你帮助我 –