根据不同的组合过滤表中的数据

时间:2017-04-21 13:02:08

标签: sql sql-server

今天,我们正在研究SQL服务器查询,并在一个简单的逻辑中面对一个小问题。我们有一个有3列的表。您可以看到表格的结构,如下所示。

ID | Name | FKId
1     a       1
2     b       1
3     c       1
4     a       2
5     b       2
6     a       3
7     c       3
8     b       5
9     c       5

在上表中,您可以看到一个列'Name',它有三种不同类型的值a,b,c和'FKId'是一个外键列。在我们的结果中,我们需要那些行,其中我们将'Name'列值组合为a,b和a,c用于每个'FKId'。没有其他组合被接受。在上表中,我们需要以下结果。

ID | Name | FKId
4     a       2
5     b       2
6     a       3
7     c       3

1 个答案:

答案 0 :(得分:1)

我会做这样的事情:

with fkids as (
   select fkid,
          max(case when name='a' then 1 else 0 end) as has_a,
          max(case when name='b' then 1 else 0 end) as has_b,
          max(case when name='c' then 1 else 0 end) as has_c
      from table
      group by fkid
)
select table.* from table
    join fkids on
        fkids.fkid = table.fkid and (
           (has_a = 1 and has_b = 1 and has_c = 0) or 
           (has_a = 1 and has_b = 0 and has_c = 1)
        )