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

Я работаю над сценарием «obfuscator данных». Я хочу обновить каждую запись в таблице поддельными данными. У меня есть таблица с местоположениями и попытка выбрать случайную запись из этой таблицы, чтобы обновить записи в моей личной таблице. Поэтому SQL, подобный этому

UPDATE Person SET City = (SELECT TOP 1 City FROM z.CityStateZip c2 ORDER BY Newid()) 

Проблема в том, что он только когда-либо выбирает 1 город, вместо того, чтобы выбирать случайный Город для каждого человека. Я тоже пробовал

 (SELECT TOP 1 City FROM z.CityStateZip c2 ORDER BY NEWID()), PersonId, from Person 

Но он по-прежнему выбирает только один город (я думал, что sub-запросы выполнялись один раз для каждой записи) вместо того, что я хочу – случайный город для каждой записи.

Я также попытался объединиться с теми же результатами, только один город, когда-либо выбранный …

 SELECT t.City, PersonId FROM Person INNER JOIN (SELECT TOP 1 City FROM z.CityStateZip c2 ORDER BY Newid()) t ON 1 = 1 

Я попытался вытолкнуть это утверждение в функцию, но SQL Server не позволяет мне использовать NEWID() внутри функции.

Ответ

Я изменил ответ Гиорги и ответ на связанный вопрос и придумал это, это очень быстро! Я изменил, как я случайно выбрал город. Приказ NewId () был проблемой. Итак, у человека есть 5k записей, а у CityStateZip ~ 30K, я взял его с 40 секунд до 4 … (теперь даже быстрее без подзапроса count)

 DECLARE @count bigint SELECT @count = count(*) from z.CityStateZip UPDATE p SET p.City= b.City FROM Person p CROSS APPLY (SELECT TOP 1 City -- if Id is unique, top 1 shouldn't be necessary FROM z.CityStateZip WHERE p.SomeKey = p.SomeKey and -- ... the magic! ↓↓↓ Id = (Select ABS(Checksum(NewID()) % @count))) b 

Вы должны заставить механизм базы данных оценивать новое значение для каждой строки. Вы можете сделать это, добавив макет, где предложение на внешней таблице выглядит так:

 DECLARE @city TABLE(ID INT IDENTITY(1, 1), City VARCHAR(100)) INSERT INTO @city VALUES ('Dallas'), ('New York'), ('Washington'), ('Las Vegas') DECLARE @random TABLE(ID INT IDENTITY(1, 1), City VARCHAR(100)) INSERT INTO @random VALUES ('Manchester'), ('London'), ('Oxford'), ('Liverpool') SELECT * FROM @city c CROSS APPLY(SELECT TOP 1 * FROM @random r WHERE c.ID = c.ID ORDER BY NEWID()) ca 

если вы удалите WHERE c.ID = c.ID вы получите одинаковое значение для всех строк.

Interesting Posts

Найдите значение одного поля, которое соответствует максимальному значению данных в другом поле

Многопоточное кэширование в SQL CLR

Запрос TSQL – столбцы для строк

Невозможна загрузка навалом, так как файл не может быть открыт. Код ошибки операционной системы 3

Попытка выбора строк и включение первых двух отличных ненулевых значений из 4 столбцов

Как просмотреть полный контент столбца text или varchar (MAX) в SQL Server 2008 Management Studio?

Невозможно использовать предикат CONTAINS или FREETEXT для таблицы или индексированного представления, это не полнотекстовое индексирование

Достаточно ли 20 МБ для базы данных блога в SQL Server или MySQL?

Массовая вставка на сервер Sql

Переменные в OPENQUERY Ошибка «Отсроченная подготовка не может быть завершена»

Предложение SQL Server OUTPUT

T-SQL удаляет дубликаты на основе столбца

принимать значения между пробелами и точками

Строки SQL COUNT Результат в отдельных столбцах

Динамически заменить строку SQL параметрами в C #

Давайте будем гением компьютера.