Использование подзапроса для получения случайного значения каждый раз выявляет одно и то же значение - PullRequest
12 голосов
/ 04 апреля 2011

Я хочу добавить случайное значение к столбцу в запросе, используя T-SQL для Microsoft SQL Server 2008 R2.Для этого я использую подзапрос и вытаскиваю случайную запись.Каждый раз, когда я запускаю запрос, он извлекает новую случайную запись, но значение для каждой строки идентично.

Как получить новое случайное значение для каждой строки?

Пример запроса:

SELECT column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 ORDER BY NewID())
FROM Table1

Принимая во внимание, что table2 выглядит как

column1
value1
value2
value3

. Она всегда возвращает одно и то же значение для column2 вместо новой случайной записи для каждой таблицы.

column1, c2
1, value1
2, value1
3, value1

Второй запуск:

column1, c2
1, value2
2, value2
3, value2

Как получить c2 (подзапрос) для получения новой случайной записи для каждой строки?

Идеальный сценарий:

column1, c2
1, value2
2, value1
3, value2

Ответы [ 2 ]

17 голосов
/ 04 апреля 2011

Попробуйте:

SELECT column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 WHERE Table1.column1 IS NOT NULL ORDER BY NewID())
FROM Table1
7 голосов
/ 04 апреля 2011

Вы можете попробовать

SELECT T1.column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 ORDER BY NewID(), LEN(T1.column1))
FROM Table1 T1

, чтобы заставить его пересматривать выбор каждый раз.Это будет очень неэффективно, хотя.Также довольно хрупкий (без LEN это не сработало!) Будет ли оно соответствовать вашему требованию отсортировать значения T2 случайным образом один раз (или, возможно, больше, если Table1 больше Table2), а затем объединить по row_number?

Основное различие, которое я вижу в методах, заключается в том, что ваш текущий метод позволит выбирать одну и ту же случайную строку несколько раз, а мой предложенный метод - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...