2013-08-01 45 views
1

我看到一个老问题,但经过两天的环顾,我无法修复它。我有两个表: 员工和random_values使用select语句更新多行SQL Server

员工都有一列:EMP_NO 3000行

random_values有一列:rand_val与100行

我试图在EMP_NO用100代替100行来自rand_val的行。

我有以下几点:

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得到相同的值,即从rand_val

目标的第一个值100行:EMP_NO应该从rand_val 100个不同行

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

回答

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