2016-06-09 57 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