提问人:Twinkles 提问时间:9/25/2023 最后编辑:marc_sTwinkles 更新时间:9/25/2023 访问量:53
通过 UPDATE SELECT 更新表时出现问题
Problem with updating the table via UPDATE SELECT
问:
我正在使用 MS SQL Server。我有 2 张表:
Table1
存储有关单个对象编号 ()、其属性编号 () 和此属性值 () 的信息。Object_id
Prop_id
Value
例
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
答:
如果逐步编写查询,则会更容易
首先,您需要从 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_id
Name
Table2
接下来,将其重新加入以进行更新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
我认为你必须明白你在做什么。
根据属性 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 = 55
PropertyNames
Object_id
Name
然后,我们使用从 CTE 获取的相关属性名称 (Name) 更新表 1,其中 .Prop_id = 76
使用属性 55 与表 2 中的相应名称之间的映射,此查询将更新属性 76 的表 1 中的值。
评论