SQL Server 2017:同时在表中与来自另一个表的数据同时更新2列。

发布于 2025-02-10 19:14:50 字数 1580 浏览 5 评论 0原文

我使用的是Microsoft SQL Server 2017。我使用另一个表中的值更新表的问题存在问题。

我使用以下设置:

表“ main”:

idval1val2
42nullnull

表“ val”:

mainidtypeval
421345.67
422567.89

,然后我想更新(在1个语句中)在“ main”中的val1和val2列中通过“ val”的值:

UPDATE m
SET m.Val1 = CASE WHEN v.Type = '1' THEN v.Val ELSE m.Val1 END,
    m.Val2 = CASE WHEN v.Type = '2' THEN v.Val ELSE m.Val2 END
FROM Main m 
INNER JOIN Val v ON m.ID = v.MainID

val1通过类型1的值应更新为345.67和val2通过类型2的2 应更新为567.89如下:

表“主”:

IDVal1Val2
42345.67567.89

但是,实际结果是:

table“ main”:

idval1val2
42345.67null

我在这里做错了什么?有什么想法吗?

还请在此处利用SQLFIDDLE示例: http://sqlfiddle.com/#!18/ AB9BF0/14

我知道Stackoverflow上已经有许多类似的问题,但是总是做一些稍有不同的事情,因此不幸的是,它们对我没有帮助。如果您发现一个可以解决我的问题的人,我很乐意检查一下。

非常感谢。

I'm using Microsoft SQL Server 2017. I have a problem with an update of a table using values from another table.

I use the following setup:

Table "Main":

IDVal1Val2
42NULLNULL

Table "Val":

MainIDTypeVal
421345.67
422567.89

Then I want to update (in 1 statement) the Val1 and Val2 columns in "Main" with the values from "Val":

UPDATE m
SET m.Val1 = CASE WHEN v.Type = '1' THEN v.Val ELSE m.Val1 END,
    m.Val2 = CASE WHEN v.Type = '2' THEN v.Val ELSE m.Val2 END
FROM Main m 
INNER JOIN Val v ON m.ID = v.MainID

Val1 via Type 1 should be updated to 345.67 and Val2 via Type 2 should be updated to 567.89, so that the desired result should look as follows:

Table "Main":

IDVal1Val2
42345.67567.89

However, the actual result is:

Table "Main":

IDVal1Val2
42345.67NULL

What am I doing wrong here? Any ideas?

Please also take advantage of the SQLFiddle example here: http://sqlfiddle.com/#!18/ab9bf0/14

I know there are many similar questions on Stackoverflow already, but always doing something slightly different, so unfortunately they were of no help to me. If you found one that might solve my issue I'm more than happy to check it out.

Thanks very much in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱*していゐ 2025-02-17 19:14:51

使用子问题。通过查询在子查询中和联接到主表中计算该组

UPDATE m
SET    m.Val1 = v.Val1,
       m.Val2 = v.Val2
FROM   Main m 
INNER JOIN 
(
    SELECT MainID,
           Val1 = MAX(CASE WHEN Type = '1' THEN Val END),
           Val2 = MAX(CASE WHEN Type = '2' THEN Val END)
    FROM   Val
    GROUP BY MainID
 ) v ON m.ID = v.MainID;

use sub-query. Calculate the GROUP BY query in the sub-query and the join to Main table

UPDATE m
SET    m.Val1 = v.Val1,
       m.Val2 = v.Val2
FROM   Main m 
INNER JOIN 
(
    SELECT MainID,
           Val1 = MAX(CASE WHEN Type = '1' THEN Val END),
           Val2 = MAX(CASE WHEN Type = '2' THEN Val END)
    FROM   Val
    GROUP BY MainID
 ) v ON m.ID = v.MainID;
千纸鹤带着心事 2025-02-17 19:14:51

一种优雅的方法是使用pivot

update main
set val1=[1], val2 = [2] 
from Val
pivot (
    max(val) for type in ([1],[2])  
    ) p
where main.ID=p.MainID

An elegant way to do it is using pivot:

update main
set val1=[1], val2 = [2] 
from Val
pivot (
    max(val) for type in ([1],[2])  
    ) p
where main.ID=p.MainID
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文