2016-04-29 15 views
0

誰でも私がこのクエリーで間違っていることを理解できます。 Sent(1)とBounced(0)のステータスを持つすべてのEmailIdを削除します。これら2つのステータス以外のものはDelivered(4)とみなされます。出力には、ステータスが1と0でないEmailIdのステータスがDelivered(4)であるEmailIdのみが含まれています。下の例では、EmailId 4も配信ステータスがT-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

私はあなたが達成しようとしているものによって混乱しています。これはかなり簡単な要求だと思われますが、不必要に複雑な解決策があります。 3つの別々の結果セットを返す複数のSELECT文があります。 0と1のステータスをフィルタリングしようとしているだけの場合は、最初のSELECTクエリですでにその処理を行っています(一時テーブルにこれらの行を挿入しているため、表示されません)。 –

+0

@ Boyd、私はちょうど私が持っていた余分な選択ステートメントを取り除いた。私は0と1両方のstatusIds.Enys.EnyIをすべてのEmaiIdを排除しようとしている1つの列にEmailIdと表示される必要があります)(次の列に重複するEmailIdsはありません)。私のaggreateクエリでEmailId 4が表示されません –

+0

ああ、そうです。 EmailID 4が表示されない理由は、WHERE e.StatusId NOT IN(1,0)を使用してフィルタリングするためです。これはORステートメントであり、本質的に「statusIDが1または0ではない」と言っています。私は答えを投稿します。 –

答えて

2

これは(あなたが一時テーブルなしでこれを行うことができますこれに取得する場しのぎの方法の一種ですが、私はここにいることをやっていると私を提供することができる任意の助けに感謝します独自の構文に従ってください)。何の関係もありません... FROM SELECT 1:

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 

をところで:最初のクエリがマッチ1と0の2番目のクエリは、最初のクエリには存在しない電子メールIDを返す行をつかみますステータスID#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

、ありがとうございます。私の大きな問題を解決するためにこのクエリで出発点があります。本当にありがとう –