Это будет работать для любого количества строк в целевых и исходных таблицах. Идея состоит в том, чтобы вычислить количество строк в случайной таблице, а затем присвойте номер rn % @c
каждой строке в таблице назначения. А затем обновить на основе присоединиться:
DECLARE @count INT = 21
DECLARE @i INT = 1
DECLARE @c INT = 0
DECLARE @t TABLE (ID INT, Random INT)
DECLARE @r TABLE (ID INT, Random INT)
INSERT INTO @r
VALUES (1, 10),
(3, 20),
(4, 30),
(6, 40),
(8, 50),
(11, 60),
(14, 70),
(17, 80),
(19, 90),
(21, 100)
WHILE @i <= @count
BEGIN
INSERT INTO @t
VALUES (@i, NULL)
SET @i = @i + 1
END;
SELECT @c = COUNT(*)
FROM @r;
WITH ctet1
AS (SELECT * , ROW_NUMBER() OVER (ORDER BY ID) AS rn
FROM @t
),
ctet2
AS (SELECT * ,
CASE WHEN rn % @c = 0 THEN @c
ELSE rn % @c
END AS rnn
FROM ctet1
),
cter
AS (SELECT * , ROW_NUMBER() OVER (ORDER BY ID) AS rn
FROM @r
)
UPDATE ct
SET Random = cr.Random
FROM ctet2 ct
JOIN cter cr ON cr.rn = ct.rnn
SELECT * FROM @t
Выход:
ID Random
1 10
2 20
3 30
4 40
5 50
6 60
7 70
8 80
9 90
10 100
11 10
12 20
13 30
14 40
15 50
16 60
17 70
18 80
19 90
20 100
21 10
Если вы не хотите обновления цикла то нет необходимости для представлений, функций и ненужных вещей. Просто обновление:
UPDATE @t SET Random = (SELECT TOP 1 Random FROM @r ORDER BY NEWID())
Я считаю, что если вы предоставите структуры таблиц, образцы данных и объясните ожидаемый результат более четко, вы получите ответ быстрее. –
Насколько случайным? Обычно я беру два разных модуля и получаю «полуслучайные» данные. – jarlh