2011-03-12 57 views
0

需要帮助在逻辑数据更新我有3个表:使用存储过程

  1. 帐户(使用的字段:ID VARCHAR(20)和名称为varchar(50))

  2. OpttyPartner(字段使用:ID15 VARCHAR(20),ACCOUNTTOID VARCHAR(20)

  3. Final2([机会ID] VARCHAR(20),合伙VARCHAR(400)

我需要更新每个记录的最终合作伙伴字段,以及来自会计科目表的名称。 Final2涉及OpptyPartner含{机会ID]和ID15 帐户与具有ID和ACCOUNTTOID OpptyPartner相关

如果存在多于一个的accounttoid为同一机会ID则名称应附加并用“分隔; “

例如:

Final2 

ID  Partner 
1  


OpptyPartner 
ID15    ACCOUNTTOID 
    1     A1 
    1     A2 

Accounts 
    ID     Name 
    A1     ABC com 
    A2     EFG com 

在合作伙伴的输出应该是 'ABC COM; EFG COM'

如何才能实现这一目标?游标?

UPDATE:

;With partners as 
(select * from Accounts inner join OpptyPartner on 
Accounts.ID COLLATE Latin1_General_CS_AS=OpptyPartner.[ACCOUNTTOID] COLLATE Latin1_General_CS_AS 
inner join Final2 on Final2.[Opportunity ID] = OpptyPartner.ID15) 
Update Final2 set Partner = p.Names from 
Final2 inner join 
(select [Opportunity ID] , LEFT(Names, len(Names)-1) as Names from 
(SELECT j.[Opportunity ID] , 

    (SELECT cast(p1.NAME as varchar(10)) + ';' 

     FROM partners p1 

     WHERE p1.[Opportunity ID] = j.[Opportunity ID] 

     ORDER BY NAME 

     FOR XML PATH('')) AS Names 
    FROM partners j 
    GROUP BY [Opportunity ID])A 
) p on Final2.[Opportunity ID] = p.[Opportunity ID] 

回答

1

我认为这可能是有用的:

;With partners as 
(select [Opportunity ID], Name from accounts inner join OpttyPartner on 
accounts.id=OpttyPartner.[ACCOUNTTOID] 
inner join final2 on final2.[Opportunity ID] = OpttyPartner.id15) 
Update final2 set partner = p.names from 
final2 inner join 
(select [Opportunity ID] , LEFT(Names, len(Names)-1) as Names from 
(SELECT j.[Opportunity ID] , 

     (SELECT cast(p1.Name as varchar(10)) + ';' 

      FROM partners p1 

      WHERE p1.[Opportunity ID] = j.[Opportunity ID] 

      ORDER BY Name 

      FOR XML PATH('')) AS Names 
     FROM partners j 
     GROUP BY [Opportunity ID])A 
) p on final2.[Opportunity ID] = p.[Opportunity ID] 

尝试使用此(添加整理必要时),如果你有opptyPartner多条记录与相同的ID15和ACCOUNTTOID:

;With partners as 
(select [Opportunity ID], Name from accounts inner join (select distinct [ID15] 
     ,[ACCOUNTTOID] from OpttyPartner) OpttyPartner on 
accounts.id=OpttyPartner.[ACCOUNTTOID] 
inner join final2 on final2.[Opportunity ID] = OpttyPartner.id15) 
Update final2 set partner = p.names from 
final2 inner join 
(select [Opportunity ID] , LEFT(Names, len(Names)-1) as Names from 
(SELECT j.[Opportunity ID] , 

     (SELECT cast(p1.Name as varchar(10)) + ';' 

      FROM partners p1 

      WHERE p1.[Opportunity ID] = j.[Opportunity ID] 

      ORDER BY Name 

      FOR XML PATH('')) AS Names 
     FROM partners j 
     GROUP BY [Opportunity ID])A 
) p on final2.[Opportunity ID] = p.[Opportunity ID] 
+0

'ID'列被指定为多个次'合作伙伴'。我得到这个错误 – Prady 2011-03-12 05:04:29

+0

@Prady:在我的表格设计中看到的名为唯一的“ID”列是在Accounts表上。我修改了我的答案,只选择了几列。 – 2011-03-12 05:09:23

+0

@Radu我已更新原来的问题与我正在使用的查询..我不得不添加排序规则 – Prady 2011-03-12 05:26:34