Цель следующего (упрощенного) фрагмента кода - вернуть одну случайную строку .К сожалению, когда мы запускаем этот фрагмент в анализаторе запросов, он возвращает от нуля до трех результатов.
Поскольку наша входная таблица состоит из ровно 5 строк с уникальными идентификаторами, и когда мы выполняем выборку для этой таблицы, где идентификатор равен случайному числу, мы озадачены тем, что когда-либо будет больше, чемвернулся один ряд.
Примечание: среди прочего, мы уже пытались привести результат контрольной суммы к целому числу безрезультатно.
DECLARE @Table TABLE (
ID INTEGER IDENTITY (1, 1)
, FK1 INTEGER
)
INSERT INTO @Table
SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
SELECT *
FROM @Table
WHERE ID = ABS(CHECKSUM(NEWID())) % 5 + 1
Редактировать
Наше использованиеСценарий таков (пожалуйста, не комментируйте, правильно ли это делать или нет. Это решающие силы)
В конечном итоге мы должны создать результат с реалистичным значений, при которых комбинация производителя и весов равна обфусцированному путем случайного выбора существующих весов из самой таблицы.
Тогда запрос станет примерно таким (также причина, по которой RAND
не можетбыть использованы)
SELECT t.ID
, FK1 = (SELECT FK1 FROM @Table WHERE ID=ABS(CHECKSUM(NEWID())) % 5 + 1)
FROM @Table t
Поскольку внутреннее выделение может возвращать ноль результатов, оно будет возвращать значение NULL, которое снова неприемлемо.Это вопрос о том, почему внутренний отбор возвращает результаты от нуля до x, что этот вопрос возник (это даже английский?).
Ответ
То, что зажгло свет для меня, былопростое наблюдение, что ABS(CHECKSUM(NEWID())) % 5 + 1)
был переоценен для каждой строки .У меня сложилось впечатление, что ABS(CHECKSUM(NEWID())) % 5 + 1)
будет оцениваться один раз , а затем совпадать.
Спасибо всем за ответы и медленно, но верно ведущие меня к лучшему пониманию.