【发布时间】:2015-01-12 14:57:12
【问题描述】:
我希望根据包含更新详细信息的表 Y 更新表 X 中的记录。困难在于
- 一行 Y 表示更新 X 中指定数量的记录。
- Y 中可能有多个记录指定对 X 中记录的不同更新,这些记录在它们匹配的字段中是相似的;在这种情况下,更新应该应用于 X 的不相交子集。
假设 X = materials(id, type_id, status, data); Y = material_updates(run_id, type_id, quantity, data)
(id 只是一个内部主键字段)
那么我想做的是(相当于)循环一个简单的查询,比如
SELECT *
FROM material_updates
WHERE run_id = :run;
对于结果集的每个row,应用类似
UPDATE TOP(row.quantity) materials
SET data = row.data, status = 1
WHERE status = 0 AND type_id = row.type_id;
(对status 的更改恰好在我要解决的问题中保持不变)
样本数据
materials_update 表:
run_id type_id quantity data
1 1 3 42
1 2 2 69
1 2 1 105
更新前的材料表:
type_id status data
1 1 17
1 1 17
1 0 0
1 0 0
1 0 0
1 0 0
2 0 0
2 0 0
2 0 0
2 0 0
更新后的材料表:
type_id status data
1 1 17
1 1 17
1 1 42
1 1 42
1 1 42
1 0 0
2 1 69
2 1 69
2 1 105
2 0 0
我认为可以使用光标来完成,但这是最好的解决方案,还是有更有效的方法?
【问题讨论】:
-
这个问题对你来说可能看起来很清楚,但我们对每个问题都不太了解。你能举几个例子吗?
-
@ZoffDino 你的意思是material_updates表的例子,以及操作前后的materials表应该是什么样子的?
-
SQL 中很少需要循环。您可以使用
FROM子句创建一个 UPDATE 语句,该子句从另一个表中提取所需的数据,以及在公共列上连接源表和目标表 -
@Stewart 是的!清楚地表明您的要求的东西
标签: sql-server tsql