2015-05-09 53 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