1

古い問題ですが、2 日間見回した後、修正できませんでした。従業員と random_values の 2 つのテーブルがあります。

従業員には 1 つの列があります: 3000 行の emp_no

random_values には 1 つの列があります: 100 行の rand_val

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 DIFFERENT 行を取得する必要があります

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

2

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 つを削除する必要があると思います。

于 2013-08-01T16:20:19.167 に答える