【问题标题】:Find common values (Intersection) from one column of a table depending on the given values of second column of same table根据同一表第二列的给定值从表的一列中查找共同值(交集)
【发布时间】:2013-10-16 06:06:00
【问题描述】:

我在下表中指定了供应商交付产品的区域,其中包含三列

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_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 上面写。

提前致谢。

【问题讨论】:

    标签: sql sql-server intersection intersect


    【解决方案1】:
    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

    【讨论】:

    • 我只想澄清3 来自于在IN 子句中添加参数的数量。因此,除非 OP 找到一种方法来计算发送给 SP 的参数数量,否则他们将不得不添加一个包含发送的 Supp_ID 数量的额外参数
    • @MostyMostacho 谢谢,对答案进行了澄清,希望对您有所帮助
    【解决方案2】:

    使用以下查询。这将获取每个供应商的所有唯一区域 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)
    

    【讨论】:

    • 抱歉,没有注意到您要求的是通用版本。在这里。
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多