1

我看到了一个老问题,但是经过两天的环顾,我就是无法解决它。我有两个表:employee 和 random_values

员工有一列:emp_no 有 3000 行

random_values 有一列:rand_val 有 100 行

我正在尝试用 rand_val 中的 100 行替换 emp_no 中的 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 个不同的行

任何帮助表示赞赏。谢谢。

4

1 回答 1

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 中的两个重复项之一。

于 2013-08-01T16:20:19.167 回答