2017-03-06 152 views
1

我有一個表像這樣:更新表記錄,而忽略重複

id | name | xyID 
---------------- 
1 | xxx | 100 
2 | yyy | 200 
3 | zzz | 300 
4 | zzz | 200 

我需要更新在xyID 200的所有項目現在處於xyID = 300,但我有名字和xyID一個鍵,在這種情況下,yyy會變成300,但我需要排除zzz,因爲它會是重複的。有沒有辦法我可以忽略重複?我想我可以用一個腳本來做到這一點,並選擇前一組中的所有項目,然後只更新它們,如果它們不存在,但希望只是在一個很好的查詢中。

回答

2

這將update「YYY」而不是「ZZZ」通過使用not exists()作爲where子句的一部分,以確保具有相同name一排已經爲xyId = 300記錄不存在。

update t 
    set xyId = 300 
where xyId = 200 
    and not exists (
    select 1 
    from t as i 
    where i.name = t.name 
     and i.xyId = 300 
    ); 

如果你想delete行與xyId = 200有與xyId = 300相應的記錄,你可以使用exists()像這樣:

delete 
from t 
where xyId = 200 
    and exists (
    select 1 
    from t as i 
    where i.name = t.name 
     and i.xyId = 300 
    ); 

rextester演示:http://rextester.com/IIQL1351

結果從更新:

+----+------+------+ 
| id | name | xyId | 
+----+------+------+ 
| 1 | xxx | 100 | 
| 2 | yyy | 300 | 
| 3 | zzz | 300 | 
| 4 | zzz | 200 | 
+----+------+------+ 

結果從刪除:

+----+------+------+ 
| id | name | xyId | 
+----+------+------+ 
| 1 | xxx | 100 | 
| 2 | yyy | 300 | 
| 3 | zzz | 300 | 
+----+------+------+ 
+0

嗯即時得到零行更新..好像你的邏輯是正確的,但。 – user1336827

+0

@ user1336827我的查詢中有一個錯字,很抱歉 – SqlZim