Нужна помощь в логике для обновления данных с использованием хранимой процедуры - PullRequest
0 голосов
/ 12 марта 2011

У меня есть 3 таблицы:

  1. Счета (используются поля: ID varchar (20) и Имя varchar (50))

  2. OpttyPartner (используемые поля: ID15 varchar (20), ACCOUNTTOID varchar (20)

  3. Final2 ([ID возможности] varchar (20), партнер varchar (400)

Мне нужно обновить поле Partner каждой записи для final2 с именем из таблицы аккаунтов. Final2 связан с OpptyPartner с {ID возможности] и ID15 Аккаунты связаны с OpptyPartner с идентификатором и ACCOUNTTOID

Если существует несколько учетных записей для одного и того же идентификатора возможности, к именам следует добавить и разделить символом ';'

Например:

 Final2

 ID       Partner
 1       


 OpptyPartner
 ID15                ACCOUNTTOID
  1                   A1
  1                   A2

 Accounts
  ID                 Name
   A1                 ABC com
   A2                 EFG com

Выход в Partner должен быть '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 Ответ

1 голос
/ 12 марта 2011

Я думаю, что это может быть полезно:

    ;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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...