我有一个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
答案 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字段进行匹配。