通过 UPDATE SELECT 更新表时出现问题

Problem with updating the table via UPDATE SELECT

提问人:Twinkles 提问时间:9/25/2023 最后编辑:marc_sTwinkles 更新时间:9/25/2023 访问量:53

问:

我正在使用 MS SQL Server。我有 2 张表:

Table1存储有关单个对象编号 ()、其属性编号 () 和此属性值 () 的信息。Object_idProp_idValue

Object_id Prop_id 价值
1 55 980
1 76
2 55 970
2 76
3 55 960
3 76

Table 2包含对象属性的值:

NUM 名字
980 美国广播公司
970 DEF的
960 用户界面·

我需要使用表 2 中的值更新表 1。我需要将“Name”放在索引为 76 的属性的“Value”列中。两个表的连接应通过表 1 中属性 55 的字段“Value”和表 2 中的“Num”字段进行。

最后,我想得到这个:

Object_id Prop_id 价值
1 55 980
1 76 美国广播公司
2 55 970
2 76 DEF的
3 55 960
3 76 用户界面·

请帮我写一个查询,给出想要的结果!

我已经尝试了几个 SQL 查询,但它们要么根本不更新表,要么只替换数据样本中的第一个值。

我的尝试:

UPDATE Table1
SET Table1.Value = name1.name
FROM (SELECT Table2.name 
      FROM Table1 
      JOIN Table2 ON Table2.num = Table1.Value 
                  AND Table1.Prop_id = 55) AS name1
WHERE Table1.Prop_id = 76

此尝试将更新表中的值,但仅将查询中的第一个值插入到所有行中(即属性为 76 的所有行中的 ABC 值)。SELECT

sql sql-server sql-update sql-server-2008-r2

评论

1赞 marc_s 9/25/2023
旁注:SQL Server 2008 和 2008 R2 在几年前已结束生命周期,现在完全不受支持。您确实应该考虑升级到受支持的版本。

答:

1赞 Squirrel 9/25/2023 #1

如果逐步编写查询,则会更容易

首先,您需要从 Table2 链接到 Table1 获取值

select *
from   Table1 t1
       inner join Table2 t2  on t1.Value = t2.NUM
Object_id Prop_id 价值 NUM 名字
1 55 980 980 美国广播公司
2 55 970 970 DEF的
3 55 960 960 用户界面·

您将从以下位置获得关联值Object_idNameTable2

接下来,将其重新加入以进行更新Table1

select *
from   Table1 t1
       inner join Table2 t2  on t1.Value = t2.NUM
       inner join Table1 t1u on t1.Object_id = t1u.Object_id
where  t1u.Prop_id = 76
Object_id Prop_id 价值 NUM 名字 Object_id Prop_id 价值
1 55 980 980 美国广播公司 1 76
2 55 970 970 DEF的 2 76
3 55 960 960 用户界面· 3 76

验证结果是否符合您的要求,只需将查询更改为查询即可update

update t1u
set    Value = t2.Name
from   Table1 t1
       inner join Table2 t2  on t1.Value = t2.NUM
       inner join Table1 t1u on t1.Object_id = t1u.Object_id
where  t1u.Prop_id = 76

你会得到你想要的结果Table1

0赞 Tusher 9/25/2023 #2

我认为你必须明白你在做什么。

根据属性 55 的 Table1 中的 Value 和 Table2 中的 Num 之间的映射,可以使用公用表表达式 (CTE) 将 Table1 更新为属性 76 的 Table2 中的值。

WITH PropertyNames AS 
(
    SELECT t1.Object_id, t2.Name
    FROM Table1 t1
    JOIN Table2 t2 ON t1.Value = t2.NUM
    WHERE t1.Prop_id = 55 
) 
UPDATE t1 
SET t1.Value = pn.Name 
FROM Table1 t1 
JOIN PropertyNames pn ON t1.Object_id = pn.Object_id 
WHERE t1.Prop_id = 76;

解释:当 时,CTE 被构造为转换为表 2 中的相关属性名称 ()。Prop_id = 55PropertyNamesObject_idName

然后,我们使用从 CTE 获取的相关属性名称 (Name) 更新表 1,其中 .Prop_id = 76

使用属性 55 与表 2 中的相应名称之间的映射,此查询将更新属性 76 的表 1 中的值。