Хороший способ - записать ваши случайные значения во временную таблицу, поскольку смысл функции случайного значения заключается в том, что она либо возвращает другое значение каждый раз, когда вы вызываете ее (в результате чего для 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))