2015-05-09 2 views
0

Я пытаюсь обновить таблицу, чтобы назначить случайного человека из таблицы поиска. Вот общая схема:Столбец строки обновления SQL со случайным значением поиска

TableA (header), 
ID int, 
name varchar (30) 

TableB (detail), 
ID int, 
fkTableA int, (foreign key to TableA.ID) 
recordOwner varchar(30) null 
other detail colums.. 

TableC (owners), 
ID int, 
fkTableA int (foreign key to TableA.ID) 
name varchar(30) 

TableA имеет 10 записей, по одному для каждого типа продаж свинца бассейна. TableB имеет тысячи записей для каждой строки в TableA. Я хочу назначить правильное значение recordOwners от TableC до и даже количества строк каждый (или как можно ближе). TableC будет иметь от одной записи для каждого ряда в tableA или до 10.

Можно ли это сделать в одном заявлении? Это не обязательно. Я не могу найти оптимальный подход к скорости. Любые мысли или образцы оценены.

Обновлено:
TableA имеет от 1 до многих судов связи с TableC. Для каждой записи TableA, TableC будет иметь хотя бы одну строку, которая представляет владельца, который должен быть назначен для строки в TableB.

TableA 
int name 
1 LeadSourceOne 
2 LeadSourceTwo 

TableC 
int(id) int(fkTableA) varchar(name) 
1  1    Tom 
2  1    Bob 
3  2    Timmy 
4  2    John 
5  2    Steve 
6  2    Bill 

TableB initial data 
int(id) int(fkTableA) varchar(recordOwner) (other detail columns) 
1  1    NULL     .... 
2  1    NULL     .... 
3  1    NULL     .... 
4  2    NULL     .... 
5  2    NULL     .... 
6  2    NULL     .... 
7  2    NULL     .... 
8  2    NULL     .... 
9  2    NULL     .... 

TableB end result 
int(id) int(fkTableA) varchar(recordOwner) (other detail columns) 
1  1    TOM     .... 
2  1    BOB     .... 
3  1    TOM     .... 
4  2    TIMMY    .... 
5  2    JOHN     .... 
6  2    STEVE    .... 
7  2    BILL     .... 
8  2    TIMMY    .... 
9  2    BILL     .... 

В основном нужно случайным образом назначить запись из tableC в tableB на основе отношения к tableA.

+0

Просим предоставить дополнительную информацию. Как отношение между таблицами A и C. Мне кажется, что они находятся в соотношении 1: 1, таблица A/C находится в соотношении 1: M с TableB. Не могли бы вы показать ожидаемый результат? Примеры данных помогут вам написать запрос. –

ответ

0

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

create table #tb_owners(userId varchar(30), processed bit) 

    insert into #tb_owners(
     userId, 
     processed) 
    select userId = name, 
     processed = 0 
    from tableC 
    where fkTableA = 1 

    select @percentUpdate = cast(100/count(*) as numeric(8,2)) 
    from #tb_owners 

    while exists(select 1 from #tb_owners o where o.processed = 0) 
     begin 
      select top 1 
       @userFullName = o.name 
      from #tb_owners o 
      where o.processed = 0 
      order by newId() 


      update tableB 
      set recordOwner = @userFullName 
      from tableB ptbpd 
       inner join (
          select top (@percentUpdate) percent 
           id 
          from tableB 
          where recordOwner is null 
          order by newId() 
        ) nd on (ptbpd.id = nd.id) 


      update #tb_owners 
      set processed = 1 
      where userId = @oUserId 
     end 

    --there may be some left over, set to last person used 
    update tableB 
    set recordOwner = @userFullName 
    from tableB 
    where ptbpd.recordOwner is null 
0
UPDATE TabB SET name = (SELECT TOP 1 coalesce(tabC.name,'') FROM TabC INNER JOIN TabA ON TabC.idA = TabA.id WHERE tabA.Id = TabB.idA) 

Должен работать, но не проверен.

+0

Не будет ли то, что имя для всех будет одинаковым для каждой записи? – HunterX3

0

Попробуйте это:

UPDATE TableB 
SET recordOwner = (SELECT TOP(1) [name] 
        FROM TableC 
        ORDER BY NEWID()) 
WHERE recordOwner IS NULL