2013-10-16 35 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