2013-08-01 3 views
1

오래된 문제가 있습니다.하지만 이틀 후에 둘러보고 난 후에는 고칠 수 없었습니다. 나는 두 개의 테이블이 있습니다 직원 및 random_values ​​select 문을 사용하여 여러 행을 업데이트하십시오. SQL Server

직원이 하나의 컬럼 : 3000 행

와 EMP_NO

random_values은 하나의 열이 100 행

나는 100 EMP_NO 100 개 행을 대체하기 위해 노력하고 있어요와 rand_val을 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 

가능성 쿼리 1이 될 법한 :

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) 

가능성 쿼리 2가 될 것 같은 뭔가 :

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에서 두 개의 중복 중 하나를 제거해야합니다.

관련 문제