我正在SQL Server 2008數據庫上運行2個報表。父表是帳戶,子表是合同,並且它們在唯一標識符字段 - 帳戶ID上鍊接。SQL添加額外的子查詢以排除主要查詢的結果
我的目標是根據什麼類型的合同提供所有賬戶和合同。
我有這個疑問現在:
Select Account.*, C.* from Account
Left Join Contracts C
on C.AccountID=Account.AccountId
Where
(Case when C.T1 = 'TYPE1' or C.T1 = 'TYPE2' or C.T1 = 'TYPE3' or C.T1 = 'TYPE4' or C.T1 = 'TYPE5' or C.T1 = 'TYPE6' Then 0 Else 1 END) = 0
and EXISTS (Select E.AccountID, E.T1 from Contracts E Where E.AccountID = C.AccountID and (E.T1 LIKE 'TYPE6' and Convert(Date,E.End_Date) = Convert(Date,C.End_Date)))
Order by Account.AccountID
的想法是拉有合同的所有帳戶,其中T1 = TYPE1-6,但前提是他們有合同在哪裏T1 = TYPE6。這給出的結果是這樣的:
AccountID Contract T1
1 1 4
1 2 5
1 3 6
2 4 6
2 5 2
2 6 6
3 7 6
3 8 6
3 9 6
我從這個需要接下來的事情是,它排除只有合同TYPE6帳戶,我完全失去了。理想的結果是,我將獲得帳戶1 & 2的所有3份合同,但會從結果中刪除帳戶3。
我的假設是,我將需要一個額外的查詢,給我我不想要的結果。我不完全理解EXCEPT語句,但我覺得可能需要放在這裏嗎?
該查詢給了我所有的帳戶/合同不應該包括在我的第一個結果:
Select Account.*, C.* from Account
Left Join Contracts C
on C.AccountID=Account.AccountId
where
(Case When C.T1 = 'TYPE6' Then 0 Else 1 End) = 0
and NOT EXISTS (Select E.AccountID, E.T1 from Contracts E Where E.AccountID = C.AccountID and E.T1 NOT LIKE '%TYPE6%'and Convert(Date,E.End_Date) = Convert(Date,C.End_Date))
Order by Account.AccountID
有沒有辦法對我說「從第一查詢給我的一切,但排除一切從第二?'
此外任何清理我的言論的意見,將不勝感激。我並不是自稱擅長這一點。
謝謝!
喜並歡迎來到SO。我們需要一些細節以幫助更多。這裏是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –
我不明白爲什麼帳戶2在您的結果中。它不符合你的標準,「但只有當他們有一個合同在哪裏T1 = TYPE6」。帳戶2只有類型1,2和3.沒有類型6. –
@SeanLange這是我可以給的所有信息。我無法給你任何樣本數據。 – Brennen