Обновить таблицу со случайной записью в статусе обновления в 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())
** Отредактировано
Ответы
Ответ 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
Ответ 4
Обновить таблицу со случайными полями
UPDATE p
SET p.City= b.City
FROM Person p
CROSS APPLY (SELECT TOP 1 City
FROM z.CityStateZip
WHERE p.SomeKey = p.SomeKey and -- ... the magic! ↓↓↓
Id = (Select ABS(Checksum(NewID()) % (Select count(*) from z.CityStateZip)))) b