簡體   English   中英

SQL Server:更新基於同一表中其他行的行

[英]SQL Server : update rows based other rows in the same table

我在項目中使用SQL Server,並且必須基於同一表中的其他行來更新某些行的列值。 這是我的桌子:

| Name | Code | Locale
--------------------
| A    | ab   | en
| A    | cd   | ar
| A    | ef   | ru
| B    | gh   | ar

我需要根據語言環境為“ en”且在“名稱”中具有相同值的行的代碼值來更新其語言環境不是“ en”的行的代碼值。 確保在語言環境中帶有“ en”的每一行在“名稱”中都有唯一的值。 所以這是我希望實現的目標

| Name | Code | Locale
--------------------
| A    | ab   | en
| A    | ab   | ar
| A    | ab   | ru
| B    | gh   | ar

我在SO Update行中發現了該線程,並使用了同一張表中另一行的數據 ,並嘗試了以下方法,但沒有一種起作用。

UPDATE mytable dt1, mytable dt2 
SET dt1.code = dt2.code 
WHERE dt1.NAME = dt2.NAME 
  AND dt1.code <> 'en' 
  AND dt2.code = 'en'

UPDATE mytable t1 
INNER JOIN mytable t2 ON t1.NAME = t2.NAME and t2.code = 'en' 
SET t1.code = t2.code;
WHERE t1.code <> 'en'

在SQL Server中,可以通過在update join來實現。 正確的語法是:

update t
   set code = teng.code
   from mytable t join
        (select t2.*
         from mytable t2
         where t2.locale = 'en'
        ) teng
        on teng.name = t.name;

實際上,子查詢並不是真正必需的:

update t
   set code = teng.code
   from mytable t join
        mytable teng
        on teng.name = t.name and teng.locale = 'en'

使用子查詢的另一種方式

UPDATE LocaleTable
   SET Code = ISNULL((SELECT TOP 1 Code FROM LocaleTable t WHERE t.Name = LocaleTable.Name and t.Locale = 'en' ORDER BY Code),Code)
WHERE Locale <> 'en'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM