2013-08-01 48 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中兩個重複項中的一個。