我看到一个老问题,但两天后环顾四周,我无法修复它。我有两张桌子: 员工和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个不同的行
感谢任何帮助。感谢。
答案 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中消除其中一个重复项。