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

时间:2016-04-20 15:00:21

标签: sql sql-server

我有两张这样的表:

表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 

这不完全有效,因为我还必须浏览表2中的记录。任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:1)

你根本不必使用光标。只需将两张桌子连在一起。

table_id

答案 1 :(得分:0)

您可以加入 - 或者您可以使用以下

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

答案 2 :(得分:0)

正如SQLChao所建议的那样,使用基于集合的方法可以更好地完成此操作,而不是循环遍历所有行并单独更新它们。

这是为了性能和可读性。

UIViewController *dvc = [self sourceViewController].navigationController;

阅读此问题,其中一个在此处概述了尽可能使用基于集合的查询的原因: Why are relational set-based queries better than cursors?