通过从另一个表中查找某个范围内的值来游标并更新数据库记录

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?

【讨论】:

以上是关于通过从另一个表中查找某个范围内的值来游标并更新数据库记录的主要内容,如果未能解决你的问题,请参考以下文章

如何通过从数据库中获取值来制作可靠的下拉列表

如何通过从数据库中检索值来显示文本框中的值?

遍历所有工作表并查找范围内的值。如果找到然后执行一些操作并转到

如何根据同一数据库中的另一个值更改mysql中的值?

通过从另一个表中插入额外的手动数据 PHP SQL 的 SELECT 数据

MySQL 使用游标触发并循环更新错误值