Как написать запрос ОБНОВИТЬ, чтобы использовать два столбца из другой таблицы, которые из той же случайной строки? - PullRequest
1 голос
/ 02 ноября 2011

У меня есть таблица TableA с несколькими столбцами. Я хотел бы обновить каждую строку в Таблице A так, чтобы первые два столбца каждой строки были случайно выбраны из первых двух столбцов TableB. Тем не менее, я не могу использовать что-то вроде

update TableA
    set col1 = (select top 1 col1 from TableB order by newid()),
        col2 = (select top 1 col2 from TableB order by newid())

потому что мне нужно, чтобы два столбца из TableB были из одной случайно выбранной строки. Как я могу написать запрос, чтобы убедиться, что два столбца из TableB находятся в одной строке?

1 Ответ

0 голосов
/ 02 ноября 2011

Хороший способ - записать ваши случайные значения во временную таблицу, поскольку смысл функции случайного значения заключается в том, что она либо возвращает другое значение каждый раз, когда вы вызываете ее (в результате чего для col1 и * выбираются разные строки 1002 *) или возвращает одинаковое значение для заданного начального числа (в результате чего все строки в TableA будут иметь одинаковые значения только для одной случайно выбранной строки из TableB).

В приведенном ниже коде SQL предполагается, что у вас есть столбец идентификаторов id на TableA, но вы можете легко его изменить.

-- make temporary table to use row numbers for TableA
select id, row_number() over (order by $/0) as [row] into #a from TableA;
-- make enough copies of TableB to have same number of rows as TableA
with n as
(
    select distinct n = number
           from [master]..spt_values
           where number between 1 and floor((select count(*) from TableA) / (select count(*) from TableB))
)
select b.col1, b.col2, row_number() over (order by newid()) as [row]
into #TableBRandom
from (
    select col1, col2 from TableB, n
    union all
    select top ((select count(*) from TableA) % (select count(*) from TableB)) col1, col2 from TableB
) b
-- update TableA
update TableA
    set col1 = (select top 1 col1 from #TableBRandom where [row] = (select [row] from #a where #a.id = TableA.id)),
        col2 = (select top 1 col2 from #TableBRandom where [row] = (select [row] from #a where #a.id = TableA.id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...