2013-10-16 53 views
3

我下表指出在那里供应商提供他们的产品领域,有三列作为取决于同桌

ID Supp_ID Area_ID 
1  a   P 
2  a   R 
3  a   T 
4  a   s 
.  .   . 
.  .   . 
5  b   R 
6  b   T 
7  b   V 
.  .   . 
.  .   . 
8  c   Z 
9  c   R 
10  c   P 
11  c   T 
.  .   . 
.  .   . 
.  .   . 
的第二列的给定的值从表中的一列找到共同的价值观(路口)

现在我想这样一个存储过程,例如,如果我通过Supp_IDs A,b,C到SP,它应该返回我的Area_IDs R,T这是共同在所有3个供应商。总之,我必须为给定Supp_IDs执行Area_IDs的交叉点

目前我想做是:

select Area_ID from Table_name where Supp_ID=a 
INTERSECT 
select Area_ID from Table_name where Supp_ID=b 
INTERSECT 
select Area_ID from Table_name where Supp_ID=c 

上面的代码是很好,当我知道有确切3个Supp_IDs 但我无法找到如何在运行时使用上面的逻辑将有不同数量的Supp_ID。

现在我无法找到我应该怎么写上面的SP。

在此先感谢。

回答

4
select Area_ID 
from Table1 
where Supp_ID in ('a', 'b', 'c') 
group by Area_ID 
having count(distinct Supp_ID) = 3 

或者,澄清其中3来自:

declare @Filter table(ID nchar(1) primary key) 

insert into @Filter values ('a'), ('b'), ('c') 

select a.Area_ID 
from Table1 as a 
where a.Supp_ID in (select t.ID from @Filter as t) 
group by a.Area_ID 
having count(distinct Supp_ID) = (select count(*) from @Filter) 

sql fiddle demo

+0

我只是澄清'3'来自'IN'子句中的参数数量。所以,除非OP找到一个方法来计算的发送到SP的参数量,那么就要添加包含Supp_ID量的额外的参数发送 –

+1

@MostyMostacho感谢,加入澄清的答案,希望它有助于 –

+0

@Roman Pekar,\t Mosty Mostacho非常感谢我的意见。 –

0

使用以下查询。这将获得每个供应商的所有唯一区域ID,并仅选择那些存在N次的区域ID。

DECLARE @param TABLE (supp_id int) 

insert into @param values (1),(2),(3) 

select Area_ID from 
    (select Area_ID from table_name t 
    inner join @param p on p.supp_id = t.supp_id) x 
group by x.Area_ID 
having count(*) = (select count(*) from @param) 
+0

对不起,没注意你问一个通用版本。这里是。 – Szymon