根据同一表的第二列的给定值,从表的一列中查找公共值(交集)

时间:2013-10-16 06:06:00

标签: sql sql-server intersection intersect

我的下表列出了供应商交付产品的区域,其中三列为

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_ID的交集

目前我正在尝试的是:

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

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

现在我无法找到如何在SP上面写字。

提前致谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)