2014-11-06 63 views
0

我正在尋找更新列中與同一行中其他列concatanated值的列。我正在更新的專欄是獨一無二的,而且這樣做的性質我有時會以重複的關鍵錯誤結束。我期望忽略這些錯誤,只需更新其中一條記錄並忽略其他記錄。SQL更新列並忽略重複的鍵錯誤

我的查詢看起來是這樣的:

update [Table] set Coolname = lower(Fname) + lower(Lname) 
where Coolname like '%s' 
and staticID=1995 
and Fname is not null 
and Lname is not null 

現在在FNAME和兩排L-NAME的比賽,我想只有第一記錄Coolname要更新的情況。

謝謝。 (MS SQL Server)的

+2

忽略重複鍵錯誤並不是一個好習慣......如果它不重要,一個值或多次存在的值無關緊要,但不要將其聲明爲primary_key或唯一... – Robert 2014-11-06 15:04:36

+0

瞭解,這是一個相當獨特的情況,但需要。 – 2014-11-06 15:05:48

+0

你如何定義「第一條記錄」?有某種關鍵嗎?請記住,一張桌子本身並沒有第一個或最後一個概念 – Sparky 2014-11-06 15:07:55

回答

0

怎麼是這樣的:

UPDATE[Table] 
SET Coolname = lower(Fname) + lower(Lname) 
WHERE 'PRIMARY_KEY' IN 
    (SELECT top 1 'PRIMARY_KEY' FROM [Table] 
     WHERE Coolname LIKE'%s' 
     AND staticID=1995 
     AND Fname IS NOT NULL 
     AND Lname IS NOT NULL); 

不要在SQL-Server體驗這樣的查詢應該只是一個提示...希望我是正確的。

0

您應該能夠使用一對夫婦的熱膨脹係數:

;With CoolNames as (
    select *,lower(Fname) + lower(Lname) as NewCoolName from Table 
    where Coolname like '%s' 
    and staticID=1995 
    and Fname is not null 
    and Lname is not null 
), Ordered as (
    select *,ROW_NUMBER() OVER (PARTITION BY NewCoolName ORDER BY staticID) as rn 
    from Coolnames cn 
) 
UPDATE Ordered SET CoolName = NewCoolName where rn = 1 

在哪裏,因爲你不關心哪一個被選中的更新,我選擇ORDER BY staticID - 我碰巧對於所有行都知道是一樣的,所以這真的會讓服務器任意選擇一個更新。

如果碰撞正在發生,而不是你的兩行獲得更新,但間提到你的問題之間不是一行是有資格進行更新,並在那裏CoolName已經設置,那麼現有行add

WHERE NOT EXISTS(select * from Table t where t.CoolName = cn.CoolName) 

進入Ordered CTE。