Соедините две таблицы через значение - PullRequest
0 голосов
/ 16 января 2020

Я хочу объединить 2 таблицы со связью через значение 2-й таблицы.

У меня есть 2 таблицы. case_activity (таблица основных записей) и case_activity_changes (таблица журналов).
2 таблицы являются ссылками через ActivityId.

Моя первая таблица выглядит следующим образом

SELECT activityid, caseId, description FROM dbo.case_activity WHERE CaseId = 35057152

activityid  caseId      description
----------- ----------- --------------------------------------------------
229098      35057152    Receive data correction request from participant
229099      35057152    Verify proof of change, if applicable
229100      35057152    Update Data
229101      35057152    Review / Update pension check address, if app
229102      35057152    Review/Update pension state tax elections, if app
229103      35057152    Technical Review
229104      35057152    Send to print
229105      35057152    Send data change to trustee, if app
229106      35057152    First Call Attempt
229107      35057152    Send data change to NQ pension payer, if app

, а вторая

SELECT  * FROM dbo.case_activity_changes WHERE ActivityId = 229189

ActivityId  TransactionId fieldname                                          OldValue
----------- ------------- -------------------------------------------------- ----------------------------
229189      32710860      ** INSERTED **                                     NULL
229189      32710861      TransactionId                                      32710860
229189      32710861      ViewByAssigned                                     NULL
229189      32710862      ** DELETED **                                      NULL
229189      32710862      ActivityId                                         229189
229189      32710862      AssignedDate                                       Jan 16 2020  6:47AM
229189      32710862      AssignedUserId                                     51809
229189      32710862      BeginDate                                          NULL
229189      32710862      CaseId                                             35057152
229189      32710862      ChangedUserId                                      51809
229189      32710862      CompletedDate                                      NULL
229189      32710862      CompletedUserId                                    NULL
229189      32710862      CreatedDate                                        Jan 16 2020  6:47AM
229189      32710862      CreatedUserId                                      51809
229189      32710862      Description                                        DO
229189      32710862      DueDate                                            NULL
229189      32710862      EmailSentTo                                        NULL
229189      32710862      NoteText                                           NULL
229189      32710862      SequenceOrder                                      40
229189      32710862      Status                                             1
229189      32710862      SubtypeId                                          341
229189      32710862      TransactionId                                      32710861
229189      32710862      ViewedByAssigned                                   Jan 16 2020  6:47AM

Мой результат должен выглядеть следующим образом

activityid  caseId      description                                          action
----------- ----------- -------------------------------------------------------------
229098      35057152    Receive data correction request from participant
229099      35057152    Verify proof of change, if applicable
229100      35057152    Update Data
229101      35057152    Review / Update pension check address, if app
229102      35057152    Review/Update pension state tax elections, if app
229103      35057152    Technical Review
229104      35057152    Send to print
229105      35057152    Send data change to trustee, if app
229106      35057152    First Call Attempt
229107      35057152    Send data change to NQ pension payer, if app
229189      35057152    DO                                                  DELETED

Обратите внимание, что последняя запись, actionid = 229189 больше не существует в case_activity , но есть
журнал case_activity_changes , указывающий, что он был удален со значением описания 'DO' и caseId = 35057152

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Для удовлетворения ваших требований динамически c, я использовал cte , string_agg и union all в запросе ниже

;WITH cte_deleted AS
  (SELECT cac.activityid AS 'activityid',     
      -- string_agg(CASE WHEN fieldname <> 'caseId' THEN '' ELSE oldvalue END , '') AS 'caseId',
      -- string_agg(CASE WHEN fieldname <> 'description' THEN '' ELSE oldvalue END , '') AS 'description',
      -- using string_agg is ideal here, but for older versions (upto 2016), max also do the trick
      max(case when fieldname <> 'caseId' then '' else oldvalue end ) as 'caseId',
      max(case when fieldname <> 'description' then '' else oldvalue end) as 'description', 
      'DELETED' AS 'action'
   FROM case_activity_changes cac
   WHERE NOT EXISTS
       (SELECT 1
        FROM case_activity ca
        WHERE ca.activityid = cac.activityid)
     AND fieldname in('CaseId','Description')
   GROUP BY cac.activityid)

SELECT activityid,caseId,description,'' AS action
FROM dbo.case_activity
<where condition>
UNION ALL
SELECT *
FROM cte_deleted
<where condition>

Вы можете попробовать. fiddle

Редактировать: Поскольку string_agg является функцией sql server 2017, обновил ответ функцией max, которая также работает для этого сценария

0 голосов
/ 16 января 2020

Вам не нужно использовать join для этого. Используйте union вместо этих удаленных транзакций.

select activityid, caseId, description, '' as Action
from dbo.case_activity  where CaseId = 35057152
union all
select ActivityId, 35057152, 'Do', 'Deleted'
from bo.case_activity_changes where ActivityId not in 
    (select activityid from dbo.case_activity where CaseId = 35057152)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...