使用3个表更新SQL查询

时间:2011-03-04 09:01:07

标签: sql sql-server-2005 tsql concatenation

我有3张桌子

Table A
Account Id         Account Name
1                  Account1
2                  Account2
3                  Account3

表B

  Opp ID            Partner Account ID
  O11               1
  O11               2

表C

  Opp Id           Pstring
  O11
  O12

我想用帐户名更新表C Pstring,如果同一个oppID有2个帐号ID,那么它们之间应附加分号并在Pstring中更新

例如

  • 对于Opp Id O11,Pstring应该有Account1;Account2

我怎样才能做到这一点?任何指针都会有很大的帮助。

2 个答案:

答案 0 :(得分:2)

示例表

create table A (AccountId int, AccountName varchar(100))
insert A select 1 ,'Account1'
insert A select 2 ,'Account2'
insert A select 3 ,'Account3'
create table B (OppID varchar(10), PartnerAccountID int)
insert B select 'O11', 1
insert B select 'O11', 2
create table C (OppId varchar(10), Pstring varchar(1000))
insert C (OppId) select 'O11'
insert C (OppId) select 'O12'

创建一个函数来连接OppID的帐户名称(一次性创建)

create function dbo.concatAccountName(@OppId varchar(10)) returns varchar(8000)
as
begin
declare @tmp varchar(8000)
select @tmp = isnull(@tmp+';','') + A.AccountName
from A
inner join B on A.AccountID = B.PartnerAccountID
where B.OppID=@OppId and A.AccountName is not null
return @tmp
end
GO

更新查询

update C
set PString = dbo.concatAccountName(OppID)

答案 1 :(得分:1)

尝试这样的事情:

UPDATE C
SET PString = X.PString
FROM
 (
   SELECT OppID, 
       (SELECT CAST(AccountName + ';' AS VARCHAR(MAX)) 
        FROM A 
        WHERE (A.AccountID = B.PartnerAccountID) 
        FOR XML PATH ('')
      ) AS PString
   FROM B
  ) X
WHERE X.OppID = C.OppID

有关详细信息,另请参阅this question