2017-10-12 79 views
0

我有一個場景,我想從第二個表的多行更新多列第一個表。但是案例只是從第二個表格的第一行更新。在SQL Server中使用大小寫更新

有沒有使用光標達到此目的的任何幫助?

create table Table1 (ColA varchar(20), ColB varchar(20), ColC varchar(20)) 

insert into Table1 values (1, null, null) 

create table Table2 (ColA varchar(20), ColB varchar(20), ColValue varchar(20)) 

insert into Table2 values (1, 2, 'X'), (1, 3, 'Y') 

update Table1 
set ColB = case 
       when T1.ColB = 2 
       then T1.ColValue 
       else T0.ColB 
      end, 
    ColC = case 
       when T1.ColB = 3 
       then T1.ColValue 
       else T0.ColC 
      end 
from Table1 T0 
inner join Table2 T1 on T0.ColA = T1.ColA 

select * from Table1 

綜觀結果,語句只更新ColB

回答

0

有一些是可以這樣做的方式,這裏是一個:

UPDATE t1 
    SET ColB = t2.ColValue 
    FROM Table1 AS t1 
    JOIN (SELECT * FROM Table2 WHERE Table2.ColB = 2) AS t2 
    ON t1.ColA = t2.ColA; 

UPDATE t1 
    SET ColC = t2.ColValue 
    FROM Table1 AS t1 
    JOIN (SELECT * FROM Table2 WHERE Table2.ColB = 3) AS t2 
    ON t1.ColA = t2.ColA; 

但這在涉及兩個通行證每個表,但語法非常簡單,這總是一個獎金。

如果需要使用一個單獨的語句嘗試這樣的:

UPDATE t1 
    SET ColB = ISNULL((SELECT TOP 1 ColValue FROM Table2 WHERE Table2.ColA = t1.ColA AND Table2.ColB = 2), t1.ColB), 
     ColC = ISNULL((SELECT TOP 1 ColValue FROM Table2 WHERE Table2.ColA = t1.ColA AND Table2.ColB = 3), t1.ColC), 
     ... 
    FROM Table1 AS t1; 

使用ISNULL()以避免更新那裏什麼也沒有Table2

+0

這很簡單,但我將有12至20列,我需要根據其它表類型的設置值。爲每一列寫一個更新不是一個好主意。 –

+0

@RAJUSAGI更新後顯示一條語句。這就是爲什麼它有助於在原始問題中包含所有相關細節:) – mendosi

+0

感謝您的更新。我使用了相同的邏輯。問題在於第二個表本身是一個複雜的查詢條件。我用公用表表達式在這種情況下非常有幫助 –

0
UPDATE Table1 
SET ColB = CASE WHEN T1.ColValue IS NOT NULL 
        THEN T1.ColValue 
        ELSE T0.ColB 
      END, 
    ColC = CASE WHEN T2.ColValue IS NOT NULL 
        THEN T2.ColValue 
        ELSE T0.ColC 
      END 
FROM Table1 T0 
INNER JOIN Table2 T1 ON T0.ColA = T1.ColA AND T1.ColB = 2 
INNER JOIN Table2 T2 ON T0.ColA = T2.ColA AND T2.ColB = 3 
+0

不需要我必須更新20多列,對每種情況使用連接使代碼看起來很複雜 –