2015-09-26 63 views
-1

我有問題關於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個值那麼我們就需要更換校驗值2個校驗值那個ID。

基於上面的表格我想負載/輸出數據到目標表像下面

目標: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) 

這查詢不返回正確的結果。

請告訴我如何編寫查詢來獲取在SQL Server中的預期輸出

回答

0

這是你如何能做到這一點:

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) 

實例SQL Fiddle

+0

你的問題說變就變「檢查「值,但實際上您正在更改名稱,因爲deptname會保留爲值爲2的行。 –