使用select语句更新多行:SQL Server

时间:2013-08-01 16:14:42

标签: sql-server

我看到一个老问题,但两天后环顾四周,我无法修复它。我有两张桌子: 员工和random_values

员工有一列:emp_no,包含3000行

random_values有一列:rand_val有100行

我正在尝试将emp_no中的100行替换为rand_val中的100行。

我有以下内容:

UPDATE employee
SET employee.emp_no=random_values.rand_val
   FROM random_values
WHERE employee.emp_no IN (SELECT emp_no FROM employee
                GROUP BY emp_no HAVING COUNT(*)>1)

结果:运行后,emp_no得到100行相同的值,即来自rand_val的第一个值

目标:emp_no应该从rand_val获得100个不同的行

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:2)

生成两个查询,一个返回要替换的emp_no,并按顺序编号的第二列。另一个对随机的做同样的事情。然后在更新中,根据数字加入它们。

UPDATE employee
SET e.emp_no=r.rand_val
FROM (query1) e
JOIN (query2) r
  ON e.number=r.number

可能的query1类似于:

SELECT emp_no,row_number() OVER(ORDER BY emp_no) as number
FROM employee
WHERE employee.emp_no IN (SELECT emp_no FROM employee
                GROUP BY emp_no HAVING COUNT(*)>1)

可能的query2类似于:

SELECT rand_val,row_number() OVER(ORDER BY NEWID()) as number
FROM random_values

所以整个事情就是:

UPDATE employee
SET e.emp_no=r.rand_val
FROM (
    SELECT emp_no,row_number() OVER(ORDER BY emp_no) as number
    FROM employee
    WHERE employee.emp_no IN (SELECT emp_no FROM employee
                GROUP BY emp_no HAVING COUNT(*)>1)) e
JOIN (
    SELECT rand_val,row_number() OVER(ORDER BY NEWID()) as number
    FROM random_values) r
  ON e.number=r.number

已经有一段时间了,您可能需要将他们加入员工表中,如下所示:

UPDATE employee
SET e.emp_no=r.rand_val
FROM employee
JOIN
(
    SELECT emp_no,row_number() OVER(ORDER BY emp_no) as number
    FROM employee
    WHERE employee.emp_no IN (SELECT emp_no FROM employee
                GROUP BY emp_no HAVING COUNT(*)>1)) e
  ON employee.emp_no=e.emp_no
JOIN (
    SELECT rand_val,row_number() OVER(ORDER BY NEWID()) as number
    FROM random_values) r
  ON e.number=r.number

但是你仍然可能难以为重复项分配一个新号码(或相同的随机数),除非你可以通过其他字段区分emp_no。我假设您的真实员工表不仅仅有1列,您需要在连接中引用emp_no和唯一字段,以确保它们被分配不同的数字,或者在query1中消除其中一个重复项。