2015-05-09 49 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项,每种类型的销售铅池。 TableBTableA中的每行有数千个条目。我想分配正确的recordOwnersTableC甚至每行的行数(或尽可能接近我可以)。 TableC将在tableA或多达10中的每一行有一个入口。

这可以在一个语句中完成吗?它不一定是。我似乎无法找出最佳的速度方法。任何想法或样品都表示赞赏。

更新:
TableATableC有一对多关系。对于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     .... 

基本上我需要基础上的关系tableA记录随机分配从tableCtableB

+0

请提供更多信息。就像表A和C之间的关系一样。在我看来,它们似乎是1:1关系,TableA/C与TableB是1:M关系。你能否展示预期的产出?示例数据将有助于为您编写查询。 –

回答

0

我结束了循环通和基于有多少业主有更新的详细记录百分之x。最终结果如下:

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