2015-03-27 3 views
0

У меня есть 2 стола. Таблица Table_View имеет 5 колонн и 200 рядов и Table_Random имеет 3 колонки с 10 рядами Мне нужно очистить колонку Table_View.A_random со значениями от Table_Random.FixValues. Если запрос достигает конца строки в Table_Randomi.e row 10, он должен начинаться с значений из верхнего ряда i.e row 1. пока он не заполнит строки 200. Учитывая, что все столы имеют primary keys.Заполните столбец со случайными значениями из разных таблиц

Любые идеи? Заранее благодарен

+1

Я считаю, что если вы предоставите структуры таблиц, образцы данных и объясните ожидаемый результат более четко, вы получите ответ быстрее. –

+0

Насколько случайным? Обычно я беру два разных модуля и получаю «полуслучайные» данные. – jarlh

ответ

1

Это будет работать для любого количества строк в целевых и исходных таблицах. Идея состоит в том, чтобы вычислить количество строк в случайной таблице, а затем присвойте номер 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()) 
1

да, вы можете сделать это.

Прежде всего, вам нужно создать и просмотреть, из чего следует вернуть одно значение из произвольной таблицы (Table_Random) для каждого вызова.

Create View vMyRand as 
Select top 1 val from myRand order by NewID(); 

затем создайте функцию для возврата значения из созданного представления.

CREATE FUNCTION GetMyRand() 
RETURNS varchar(5) 
--WITH EXECUTE AS CALLER 
AS 
BEGIN 
Declare @RetValue varchar(5) 
[email protected] = 
Select @RetValue = val from vmyRand 
RETURN(@retValue) 
END; 

Fiddle Demo Here

Полный код:

create table tab_1 
(
    id bigint identity(1,1), 
    name varchar(50), 
    email varchar(50) 
) 

    insert into tab_1(name,email) values 
    ('a','[email protected]'), ('b','[email protected]'), 
    ('a1','[email protected]'), ('a2','[email protected]'), 
     ('a3','[email protected]'), ('a4','[email protected]'), 
     ('b1','[email protected]'),('b2','[email protected]') 

    create table myRand(val varchar(50)) 

    insert into myRand values('Q1654'),('F2597'), 
    ('Y9405'),('B6735'),('D8732'),('C4893'),('I9732'), 
    ('L1060'),('H6720'); 

Create View vMyRand as 
Select top 1 val from myRand order by NewID(); 

CREATE FUNCTION GetMyRand() 
RETURNS varchar(5) 
--WITH EXECUTE AS CALLER 
AS 
BEGIN 
Declare @RetValue varchar(5) 
[email protected] = 
Select @RetValue = val from vmyRand 
RETURN(@retValue) 
END; 

Update Код:

update tab_1 set name=(select dbo.getMyRand()) 

Надежда Это поможет вам. Спасибо. :)

+0

Хммм, очень странно. 'Если запрос достигнет конца строки в Table_Random i.e строке 10, он должен начать снова со значениями из верхней строки i.e строки 1', отсюда это звучит так, как будто вы хотите принимать случайные значения в цикле. –