通过从另一个表中查找某个范围内的值来游标并更新数据库记录
Posted
技术标签:
【中文标题】通过从另一个表中查找某个范围内的值来游标并更新数据库记录【英文标题】:Cursor through and update database record by looking for value within a range from another table 【发布时间】:2016-04-20 15:00:20 【问题描述】:我有两张这样的表:
表 1
Emp_ID Emp_Name Age Level
1 Tom 22
2 Susan 50
表2
Level Min_Age Max_Age
Associate 20 30
Senior 31 45
我想做的是找出每个员工所处的级别。因此,我想:
对表 1 中的所有记录执行(所有员工) 一世。从 Table2 中选择 Level,其中 Table1.Age 在 Table2 中的 Min_Age 和 Max_Age 之间 ii.移动到下一位员工
我尝试了以下方法:
DECLARE @level int, DECLARE @employee_age int
DELCARE @min_age varcahr int, @max_age varchar int
DECLARE testcursor CURSOR
LOCAL SCROLL STATIC
FOR
Select Emp_ID FROM Table1
OPEN testcursor
FETCH NEXT FROM testcursor
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM testcursor
@min_age=select Min_age from Table2
@max_age= select Max_age from Table2
@employee_age=Select age FROM Table1
@level=select Level from Table2 where
update Table1 set level=@level where @employee_age between @min_age and max_age
END
CLOSE cursorName
DEALLOCATE cursorName
这并不完全奏效,因为我还必须浏览 Table2 中的记录。任何帮助,将不胜感激。
【问题讨论】:
【参考方案1】:您根本不必使用光标。只需将两个表连接在一起即可。
UPDATE t1
SET t1.[age level] = t2.level
FROM table1 t1
JOIN table2 t2 ON t1.[age level] BETWEEN t2.min_age and t2.max_age
【讨论】:
【参考方案2】:你可以加入-或者你可以使用以下
BEGIN
for i in (select level, [min age] as MinA, [max age] as MaxA from Table2)
LOOP
Update Table1
set Table1.[age level] = i.level
where Table1.[age level] between i.MinA and i.MaxA;
END LOOP;
END
【讨论】:
【参考方案3】:正如 SQLChao 所建议的,此操作最好使用基于集合的方法完成,而不是遍历所有行并单独更新它们。
这是为了性能和可读性。
UPDATE t1
SET t1.[level] = t2.level
FROM table1 t1
JOIN table2 t2 ON t1.[age] BETWEEN t2.min_age and t2.max_age
阅读这个问题,这里列出了尽可能使用基于集合的查询的原因: Why are relational set-based queries better than cursors?
【讨论】:
以上是关于通过从另一个表中查找某个范围内的值来游标并更新数据库记录的主要内容,如果未能解决你的问题,请参考以下文章
遍历所有工作表并查找范围内的值。如果找到然后执行一些操作并转到