2016-06-09 26 views
0

我有SQL其中將包含一個ID的多個行的表,如下SQL選擇行不是另一

accountid Productname 
1   GL 
1   IP 
1   MI 
2   GL 
2   IP 
2   PA 
3   MI 
3   CP 
3   IP 
4   GL 
4   CP 
4   CI 

我希望能夠選擇具有一定的產品的所有帳戶但不是其他。例如對於所有具有IP或GL而不是MI,使用上面這個示例表將返回賬戶2和4

SELECT ccx_accountidname 
FROM (
    SELECT ccx_accountidname, ccx_productname 
    FROM Filteredccx_leadresearch 
    WHERE ccx_productname IN ('GL','IP') 
    AND ccx_accountidname IS NOT NULL 
    ) AS T 
WHERE ccx_productname NOT IN ('MI') 
ORDER BY ccx_accountidname 

SELECT DISTINCT LR1.ccx_accountidname 
FROM Filteredccx_leadresearch LR1 
LEFT JOIN Filteredccx_leadresearch LR2 ON LR1.ccx_accountid = LR2.ccx_accountid 
AND LR2.ccx_productname IN ('GL', 'IP') 
WHERE LR1.ccx_productname NOT IN ('MI') 
AND LR1.ccx_accountidname IS NOT NULL 
ORDER BY LR1.ccx_accountidname 

均可以得到基本相同的結果,沒有任何這可以做到嗎?

預先感謝任何幫助

+0

這些只有兩列嗎? – scsimon

+0

不,有很多列,但這些是目前真正關注我的唯一2列 – SnowSheep

+0

更多的列可以讓您有機會進行轉換,但它取決於列。 – scsimon

回答

0

你能試試這個:

SELECT DISTINCT T1.Accountidname FROM TheTableThatContainsAccountnames as T1 
JOIN AccountProductsTable as T2 on T1.AccountId=T2.AccountId 
WHERE T2.ProductName = 'ProductYouWant' 
AND T2.ProductName = 'AnOtherProductYouWant' 
+0

謝謝你的回覆保羅。不幸的是,這仍然行不通,我不能在where子句中使用AND,因爲產品字段只包含一個產品。我嘗試了或,但它仍然通過其他產品的帳戶拉動。 – SnowSheep

+0

我的不好,我誤解了這個問題。我目前正在尋找解決方案,但並不像我想的那樣微不足道...... –

0

根據您的文章,你真正需要的是正確的和邏輯的簡單查詢。您需要產品名稱爲GL或IP但不在MI中的所有帳戶。這將做到沒有任何其他聯接。

SELECT ccx_accountidname 
    FROM Filteredccx_leadresearch 
    WHERE 
     ccx_productname in ('GL','IP') 
     and ccx_productname not in ('MI') 

編輯

這將讓你的帳戶,但我懷疑它會在你的整體解決方案。沒有看到完整的數據集就很難說清楚。這也可以通過參數完成。

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
DROP TABLE #TempTable 

IF OBJECT_ID('tempdb..#TempTableTwo') IS NOT NULL 
DROP TABLE #TempTableTwo 

create table #TempTable (accountid int, productname char(2)) 
insert into #TempTable (accountid,productname) values 
(1,'GL'), 
(1,'IP'), 
(1,'MI'), 
(2,'GL'), 
(2,'IP'), 
(2,'MA') 


select distinct 
    t1.accountid, 
    1 as T 
into #TempTableTwo 
from 
    #TempTable t1 
where 
    productname in ('GL','IP') 
union all 
select distinct 
    t1.accountid, 
    -1 as T 
from 
    #TempTable t1 
where 
    productname in ('MI') 

select 
    accountid 
from #TempTableTwo 
group by accountid 
having sum(T) > 0 
+0

感謝您的建議,但我不認爲這很簡單。如果他們也有IP或GL,使用這種方法仍然會返回有MI的賬戶。謝謝 – SnowSheep

+0

這將返回沒有MI的賬戶,因此是'NOT IN'。也許我對你的真實預期輸出感到困惑,或者你的代碼中缺少你需要返回或考慮的東西。 – scsimon

+0

我可能沒有正確解釋過。在我的樣本表中,accountid 1有GL,IP和MI行。因爲它有MI,我不希望這個帳戶出現,但在這個查詢中它會因爲它也有GL和IP。 Accountid 2擁有GL,IP和PA,所以我想要顯示它沒有MI。這是否有意義呢? – SnowSheep