【问题标题】:Join two tables via value通过值连接两个表
【发布时间】:2020-01-16 08:10:20
【问题描述】:

我想通过第二个表的值连接 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

请注意,最后一条记录 activityid=229189 在 case_activity 中不再存在,但有一个
登录 case_activity_changes 表明它已被删除,描述值为 'DO' 和 caseId =35057152

【问题讨论】:

  • 我只是被描述迷路了。我在更改表中看不到任何活动 ID。

标签: sql sql-server join inner-join


【解决方案1】:

您不需要为此使用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)

【讨论】:

  • 如果 caseId 是动态的怎么办?我不希望 caseId,描述被硬编码为结果
【解决方案2】:

为了以动态方式处理您的要求,我在下面的查询中使用了 ctestring_aggunion 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 函数更新了答案,该函数也适用于这种情况

【讨论】:

  • 你的想法很好,我遇到的问题是“string_agg”不是一个公认的内置函数名。
  • 你使用的是哪个版本的sql server?
  • cte 表背后的基本思想是获取已删除条目的透视值。使用时可以使用pivotfor xml
  • sql server 2016.
  • @PaulWhite 你可以使用max 函数代替string_agg。不理想,还是照做吧。
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多