2013-06-29 2 views
0

Я пытаюсь обновить каждую строку в таблице данными из случайной строки из другой таблицы. Вот SQL настоящее время я использую:Ошибка при попытке обновления строки со случайным значением

SELECT Data, RowNumber FROM SampleData 

SELECT FLOOR(ABS(CHECKSUM(NEWID()))/2147483647.0 * 3 + 1) FROM Name 

UPDATE Name SET Surname = (SELECT Data FROM SampleData WHERE RowNumber = FLOOR(ABS(CHECKSUM(NEWID()))/2147483647.0 * 3 + 1)) 

И здесь результаты я получаю:

Smith 1 
Hunt 2 
Jones 3 

2 
2 
3 
2 
1 
3 
2 
.... continues with a random number between 1 and 3 for each row in the Name table 

Msg 512, Level 16, State 1, Line 9 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

Так что мой вопрос почему ЗЕЬЕСТ производства одного случайного числа для каждой строки где подзапрос UPDATE, похоже, возвращает несколько строк. Я использую SQL Server 2012 SP1, если это имеет значение.

+0

имеет вид на этот запрос ВЫБРАТЬ Нр, Count (*) от ( Select ПОЛА (ABS (СУММА (NEWID()))/+2147483647,0 * 3 + 1), Nr от имени ) в группе пга Имея Count (*)> 1 – bummi

+0

Не совсем уверен, что это значит показать мне. Результат для этого - 3 строки, которые показывают, что 1, 2 и 3 возвращаются примерно через треть каждого из них. Но это именно то, что я ожидал бы –

+0

Вы назначаете набор или результаты в одно поле http://sqlfiddle.com/#!3/d3894/8, которое вы используете, например. 'SELECT TOP 1 Data FROM SampleData .......' – bummi

ответ

1

Вы пытаетесь обновить поле с помощью набора данных, это приведет к описанной ошибке.

Создание временной таблицы отображения и обновление имя образует соединение между идентификатором имени и «случайный» идентификатора SampleDate

SQLFiddle

SELECT ID,FLOOR(ABS(CHECKSUM(NEWID()))/2147483647.0 * 3 + 1) as RN 
Into #tmp 
FROM Name 

Update Name set SurName=Data 
from #tmp 
join SampleData sd on sd.RowNumber=#tmp.rn 
where #tmp.ID=Name.ID 

Select * from Name 
+0

Спасибо за это, он отлично работает. Я по-прежнему не понимаю, почему мой первоначальный запрос не работает, хотя –

+0

Результат второго запроса доставит много элементов, фамилия может принять только один. Вы пытаетесь в своем третьем запросе установить все имена для всех результатов 'подзапроса. Автоматически не распространяется на результат по именам. – bummi