SQL SERVER 2000:
У меня есть таблица с данными тестирования (приблизительно 100 000 строк), я хочу обновить значение столбца от другой таблицы с некоторыми случайными данными из другой таблицы. Согласно этому вопросу, Это - то, что я пробую:
UPDATE testdata
SET type = (SELECT TOP 1 id FROM testtypes ORDER BY CHECKSUM(NEWID()))
-- or even
UPDATE testdata
SET type = (SELECT TOP 1 id FROM testtypes ORDER BY NEWID())
Однако поле "типа" все еще с тем же значением для всех строк; Какие-либо идеи, что я делаю неправильно?
[РЕДАКТИРОВАНИЕ] я ожидал бы, что этот запрос возвратит одно другое значение для каждой строки, но это не делает:
SELECT testdata.id, (SELECT TOP 1 id FROM testtypes ORDER BY CHECKSUM(NEWID())) type
FROM testdata
-- however seeding a rand value works
SELECT testdata.id, (SELECT TOP 1 id FROM testtypes ORDER BY CHECKSUM(NEWID()) + RAND(testdata.id)) type
FROM testdata
Ваша проблема в том, что вы выбираете только единственное значение , а затем обновляете все столбцы этим единственным значением.
Для того, чтобы действительно получить рандомизацию, вам нужно сделать пошаговый / петлевой подход - я пробовал это в SQL Server 2008, но я думаю, что это должно работать и в SQL Server 2000:
-- declare a temporary TABLE variable in memory
DECLARE @Temporary TABLE (ID INT)
-- insert all your ID values (the PK) into that temporary table
INSERT INTO @Temporary SELECT ID FROM dbo.TestData
-- check to see we have the values
SELECT COUNT(*) AS 'Before the loop' FROM @Temporary
-- pick an ID from the temporary table at random
DECLARE @WorkID INT
SELECT TOP 1 @WorkID = ID FROM @Temporary ORDER BY NEWID()
WHILE @WorkID IS NOT NULL
BEGIN
-- now update exactly one row in your base table with a new random value
UPDATE dbo.TestData
SET [type] = (SELECT TOP 1 id FROM dbo.TestTypes ORDER BY NEWID())
WHERE ID = @WorkID
-- remove that ID from the temporary table - has been updated
DELETE FROM @Temporary WHERE ID = @WorkID
-- first set @WorkID back to NULL and then pick a new ID from
-- the temporary table at random
SET @WorkID = NULL
SELECT TOP 1 @WorkID = ID FROM @Temporary ORDER BY NEWID()
END
-- check to see we have no more IDs left
SELECT COUNT(*) AS 'After the update loop' FROM @Temporary
вы должны ввести вычисление на строку при выборе новых идентификаторов ...
это сделает трюк
UPDATE testdata
SET type = (SELECT TOP 1 id FROM testtypes ORDER BY outerTT*CHECKSUM(NEWID()))
FROM testtypes outerTT