Sql server 在SQL Server中交换行值

Sql server 在SQL Server中交换行值,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我对SQL Server有疑问 来源:emp id | name | check |deptname 100 | a | 1 |ceo 100 | b | 2 |hr 100 | c | 3 |po 100 | d | 5 |no 101 | a | 1 |pm 101 | b | 5 |ceo 102 | a |

我对SQL Server有疑问

来源:
emp

id      | name  | check |deptname 
100     |  a    |  1    |ceo   
100     |  b    |  2    |hr
100     |  c    |  3    |po
100     |  d    |  5    |no
101     |  a    |  1    |pm
101     |  b    |  5    |ceo
102     |  a    |  1    |rn
102     |  b    |  2    |han
在这里,相同的id有检查2和5个值,然后我们需要将该id的检查值替换为2个检查值

基于上表,我希望将数据加载/输出到目标表中,如下所示

目标:
emp1

id      | name  | check |deptname
100     |  a    |  1    |ceo
100     |  d    |  2    |hr
100     |  c    |  3    |po
101     |  a    |  1    |pm
101     |  b    |  5    |ceo
102     |  a    |  1    |rn
102     |  b    |  2    |han
我试着像下面一样

select 
    a1.id,
    a1.name,
    isnull(a2.[check],a1.[check]) as [check]
from 
    emp as a1
left outer join 
    emp as a2 on a2.id = a1.id
              and a1.[check] in (2,5)
              and a2.[check] in (2,5)
              and a2.[check] <> a1.[check]
where 
    a2.id is null
    or (a1.[check] = 5
        and a2.[check] = 2)
选择
a1.id,
a1.姓名,
isnull(a2.[check],a1.[check])作为[check]
从…起
emp as a1
左外连接
a2.id=a1.id上作为a2的emp
和a1。[签入]入(2,5)
和a2。[签入]in(2,5)
和a2.[检查]a1.[检查]
哪里
a2.id为空
或(a1.[检查]=5
和a2。[检查]=2)
该查询没有返回正确的结果


请告诉我如何编写查询以在SQL Server中获得预期的输出

select
  e1.id,
  isnull(e2.name, e1.name) as name,
  e1.[check],
  e1.deptname
from emp e1
left outer join emp e2
  on e2.id = e1.id and e1.[check] = 2 and e2.[check] = 5
where
  not exists (select 1 from emp e3 where e3.id = e1.id and 
      e1.[check] = 5 and e3.[check] = 2)
例如,在

中,您的问题说要更改“check”值,但实际上您正在更改名称,因为deptname保留在值为2的行中。