2 つのクエリを生成します。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 を区別できない限り、両方の重複に新しい番号 (または同じ乱数) が割り当てられるという問題が依然として発生する可能性があります。実際の従業員テーブルには複数の列があり、結合で emp_no と一意のフィールドの両方を参照して、異なる番号が割り当てられるようにするか、query1 の 2 つの重複のうちの 1 つを削除する必要があると思います。