2016-04-29 32 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

,非常感謝。我有這個查詢的出發點來解決我的大問題。真的很感謝你幫助我 –