2013-08-01 3 views
1

Старая проблема, которую я вижу, но после двухдневного осмотра я просто не мог ее исправить. У меня есть две таблицы: сотрудника и random_values ​​Обновление нескольких строк с помощью оператора select: SQL Server

сотрудник имеет один столбец: emp_no с 3000 строк

random_values ​​имеет один столбец: rand_val 100 строк

я пытаюсь заменить 100 строк в EMP_NO с 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 получает 100 строк и то же значение, а именно первое значение из rand_val

Цель: emp_no должны получить 100 различных строк из rand_val

Любая помощь приветствуется. Благодарю.

ответ

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.

Смежные вопросы