案例陈述遇到麻烦

时间:2016-01-20 20:32:39

标签: sql sql-server sql-server-2008 case exists

我有一个sql server 2008表,让我们说" alpha",有三列。它们是[ID],[col1]和[col2]。

id|col1|col2
1 |X   |john1X|
1 |Y   |john1Y|
1 |Z   |john1Z|
2 |X   |john2|
3 |Y   |john3|
4 |X   |john4|

每个ID可能有多个条目。如果col1包含' X',我希望显示该行。如果没有带有' X'在col1中,我希望' Y'选择。否则该行根本不应该出现。

对于上述样本数据,预期输出将低于。

id|col1|col2
1 |X   |john1X|
2 |X   |john2|
3 |Y   |john3|
4 |X   |john4|

我一直试图让这段代码发挥作用,

select * from alpha
where col1 = case
             when exists(select * from alpha where col1 = 'X') then 'X'
             else 'Y'
             end

但无论我如何重写代码,我都会得到以下输出。

id|col1|col2
1 |X   |john1X
2 |X   |john2 
4 |X   |john4

2 个答案:

答案 0 :(得分:2)

您可以使用row_number()

执行此操作
select a.*
from (select a.*,
             row_number() over (partition by id
                                order by col1
                               ) as seqnum
      from alpha
      where col1 in ('X', 'Y')
     ) a
where seqnum = 1;

注意:此特定逻辑按指定的方式工作,因为' X' < ' Y&#39 ;.您可以使用case语句进行更一般的排序或更多值。

答案 1 :(得分:1)

您在子查询中缺少一个子句......行

 when exists(select * from alpha where col1 = 'X') then 'X'

应该是

when exists(select * from alpha b where col1 = 'X' and b.id = alpha.id ) then 'X'

请注意,我在子查询中为表添加了一个别名,以便您可以使用主表与子查询表的ID字段进行匹配。