Обновить таблицу со случайной записью в обновлении статистики в 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())

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

 Landjea25 окт. 2012 г., 22:41
Это укажет вам правильное направление:stackoverflow.com/questions/19412/...
 chobo25 окт. 2012 г., 22:48
Ну не все одинаковые записи для каждой записи. Я просто хочу использовать 80 записей из этой таблицы
 Rango25 окт. 2012 г., 22:42
Ты нене хотите одну и ту же запись для одного? Сложно, когда в первой таблице 80, а в таблице, которую вы хотите обновить, 10M записей.
 chobo25 окт. 2012 г., 22:53
Мне нужно сделать обновление :(
 Gordon Linoff25 окт. 2012 г., 22:54
Ваш запрос выглядит хорошо. Единственное, о чем я могу думать, это то, что оптимизатор выполняет подзапрос только один раз. Так не должно быть, потому чтоnewid() является летучим
 Abe Miessler25 окт. 2012 г., 22:48
Вам нужно сделать обновление? Вы можете просто удалить все записи и сделать вставку?

Ответы на вопрос(4)

Решение Вопроса

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

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
 Lamak26 окт. 2012 г., 20:19
@MartinSmith Я сделал это на своем тестовом запросе, но не знал, что это было необходимо. И ваш ответ объясняет, почему так работает, спасибо
 CeOnSql27 мая 2015 г., 16:37
Как вы сказали, странное решение, но оно работает!
 Lamak26 окт. 2012 г., 18:29
@ Чобо, это может быть причиной. Я попробовал это с ключом для той таблицы, и это работало как предназначено.
 chobo25 окт. 2012 г., 23:00
Значения все одинаковые :(
 chobo26 окт. 2012 г., 18:23
Похоже, чем больше разных значений у A.someColumn, тем более случайные результаты
 Martin Smith26 окт. 2012 г., 19:40
Вам нужно будет сопоставить уникальное значение изA чтобы быть уверенным, что если катушка добавлена, она всегда отскок, а не перемотка.Дубликат этого вопроса
 Lamak25 окт. 2012 г., 23:06
@chobo - Действительно ?, Я проверил это с примерами данных, и он работал нормально. Но чтобы получить разные значения,WHERE A.somecolumn = A.somecolumn был обязательным
 chobo26 окт. 2012 г., 18:19
На самом деле этот запрос работает, но меня смущает то, где A.somecolumn = A.somecolumn. Кажется, я получаю разные результаты в зависимости от столбцов, которые я использую
 chobo25 окт. 2012 г., 23:59
Я нене знаю, почему это работает для вас, но я получаю одинаковые значения в каждой строке

Я думаю, что это будет работать (по крайней мере,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;

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

 Paul Suart14 июн. 2017 г., 11:30
Это прекрасно работало для меня в SQL2012; Я должен был опуститьmit псевдоним вupdate часть, однако. В общем, хорошее, логичное решение для одноразовой проблемы.
 Gordon Linoff25 окт. 2012 г., 23:15
Если вы положили в 1, где. . . есть, то должно работать. Есть идеи, почему я не могу вставить этот код?
 Paul White26 окт. 2012 г., 18:41

Обновить таблицу случайными полями

    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

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-another-table

Ваш ответ на вопрос