更新 SQL Server 中的用例

问题描述 投票:0回答:4

我有一个场景,我想从第二个表的多行更新第一个表的多列。但该案例仅从第二个表的第一行更新。

有什么帮助可以在不使用光标的情况下实现此目的吗?

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

sql-server case
4个回答
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
投票

问题是:您正在尝试在同一查询中多次更新同一行。

您可以使用 Merge 语句

参考

https://connect.microsoft.com/SQLServer/feedback/details/321926/merge-will-update-row-more-than-once-if-target-is-view-with-an-instead-of-触发


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
投票

我认为这应该可以做到:

update Table1
    set ColB =
        (
        select max(case when t2.ColB = 2 then t2.ColValue else t1.ColB end)
        from Table1 t1
        inner join Table2 t2 on t1.ColA = t2.ColA
        ),
    ColC =
        (
        select max(case when t2.ColB = 3 then t2.ColValue else t1.ColB end)
        from Table1 t1
        inner join Table2 t2 on t1.ColA = t2.ColA
        )
© www.soinside.com 2019 - 2024. All rights reserved.