Подтвердить что ты не робот

Обновить таблицу со случайной записью в статусе обновления в SQL Server?

У меня две таблицы. Table 1 имеет около 80 строк, а в Table 2 - около 10 миллионов.

Я хотел бы обновить все строки в Table 2 случайной строкой из Table 1. Мне не нужна такая же строка для всех строк. Возможно ли обновить Table 2 и случайно выбрать значение для каждой строки, которую она обновляет?

Это то, что я пробовал, но он помещает одно и то же значение в каждую строку.

update member_info_test
set hostessid = (SELECT TOP 1 hostessId FROM hostess_test ORDER BY NEWID())

** Отредактировано

4b9b3361

Ответ 1

Хорошо, я думаю, что это один из самых странных запросов, который я написал, и я думаю, что это будет ужасно медленным. Но сделайте снимок:

UPDATE A
SET A.hostessid = B.hostessId
FROM member_info_test A
CROSS APPLY (SELECT TOP 1 hostessId
             FROM hostess_test 
             WHERE A.somecolumn = A.somecolumn
             ORDER BY NEWID()) B

Ответ 2

Я думаю, что это сработает (по крайней мере, with частью):

with toupdate as (
      select (select top . . . hostessId from hostess_test where mit.hostessId = mit.hostessId order by newid()) as newval,
             mit.*
      from member_info_test mit
     )
update toupdate
    set hostessid = newval;

Ключом к этому (и к Ламаку) является внешняя корреляция в подзапросе. Это убеждает оптимизатора фактически запускать запрос для каждой строки. Я не знаю, почему это сработает, а другая версия не будет.

Ответ 3

Вот что я в итоге использовал:

EnvelopeInformation будет вашей таблицей 2

PaymentAccountDropDown будет вашей таблицей 1 (в моем случае у меня было 3 предмета) - измените с 3 по 80 для своей учетной записи.

;WITH cteTable1 AS (
    SELECT
        ROW_NUMBER() OVER (ORDER BY NEWID()) AS n,
        PaymentAccountDropDown_Id
    FROM EnvelopeInformation
    ),
cteTable2 AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY NEWID()) AS n,
        t21.Id
    FROM PaymentAccountDropDown t21
    )
UPDATE cteTable1
   SET PaymentAccountDropDown_Id = (
       SELECT Id 
       FROM cteTable2
       WHERE  (cteTable1.n % 3) + 1 = cteTable2.n
)

ссылка: http://social.technet.microsoft.com/Forums/sqlserver/pt-BR/f58c3bf8-e6b7-4cf5-9466-7027164afdc0/updating-multiple-rows-with-random-values-from-anothertable