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,它应该返回我在所有 3 个供应商中通用的Area_IDs R,T 。简而言之,我必须为给定的 Supp_ID执行 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 上面写。

提前致谢。

4

2 回答 2

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

于 2013-10-16T06:13:39.827 回答
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)
于 2013-10-16T06:10:39.093 回答