跨 3 个表的多个记录的特定字符串的顺序查找并按最新条目显示

Posted

技术标签:

【中文标题】跨 3 个表的多个记录的特定字符串的顺序查找并按最新条目显示【英文标题】:Sequential Lookup of specific string across 3 tables for multiple records and display by latest entry 【发布时间】:2020-06-13 03:50:32 【问题描述】:

我有 3 个表,其中我需要按顺序搜索特定字符串 '%sell back%' 并根据我首先找到它的位置获取 latest 条目,下面列出了更多详细信息 Table#3,3张表如下:

表#1:客户

|---------------|---------------|
|  CustomerID   | CustomerName  |
|---------------|---------------|
|    1234       | Johnathan     |
|---------------|---------------|

表#2:问题

|---------------|---------------|----------------------|---------------|
|  ProblemID    | CustomerID    | ProblemDescription   | DateReported  |
|---------------|---------------|----------------------|---------------|
|    3203494    | 1234          | Needs Appointment    | 2019-08-01    |
------------------------------------------------------------------------
|    3178766    | 1234          | Sell Back Customer   | 2019-08-12    |
------------------------------------------------------------------------
|    3178765    | 1234          |                      | 2019-08-12    |
|---------------|---------------|----------------------|---------------|

表#3:问题事件

|---------------|---------------|----------------------|---------------|
|ProblemEventID | ProblemID     | EventReason          | EventDate     |
|---------------|---------------|----------------------|---------------|
|    1926144    | 3178766       | Reported             | 2019-08-12    | 
------------------------------------------------------------------------
|    2022750    | 3178766       | sell back            | 2019-08-13    |
------------------------------------------------------------------------
|    2022751    | 3178766       | Accepted as sell back| 2019-08-26    |
------------------------------------------------------------------------
|    2022899    | 3178766       | Finalized            | 2019-08-31    |
------------------------------------------------------------------------
|    1926200    | 3178765       | Reported             | 2019-09-15    | 
------------------------------------------------------------------------
|    2022626    | 3178765       | sell back            | 2019-09-20    |
------------------------------------------------------------------------
|    2024500    | 3178765       | Accepted as sell back| 2019-09-30    |
------------------------------------------------------------------------
|    2024501    | 3178765       | Finalized            | 2019-10-05    |
|---------------|---------------|----------------------|---------------|

我正在寻找的结果应该按照下面列出的步骤顺序提取:

步骤#1

如果存在,则在问题表的 ProblemDescription 列中搜索“%sell back%”字符串,然后选择具有最新 DateReported 的相应 ProblemID 并继续执行步骤#2

第 2 步

在Problem Event表中搜索对应的problem ID(在Step#1中选择)并检查Problem Event表的EventReason列中是否存在'%sell back%'字符串,并选择最新的条目 并显示如下

|---------------|---------------|------------|-----------------------|-----------------------|------------|
|  CustomerID   | CustomerName  | ProblemId  | ProblemDescription    |      EventReason      | EventDate  |
|---------------|---------------|------------|-----------------------|-----------------------|------------|
|    1234       | Johnathan     | 3178766    | Sell Back Customer    | Accepted as sell back | 2019-08-26 |
|---------------|---------------|------------|-----------------------|-----------------------|------------|

如果对于第 2 步,在问题事件表的 EventReason 列中未找到字符串“%sell back%”,则应显示问题事件表中相应问题 ID 的最新行

替代顺序:

如果第 1 步搜索“%sell back%”字符串未产生任何结果,即 ProblemDescription 列不包含“%sell back%”字符串,则直接在 问题事件表并选择最新的条目并显示结果如下:

|---------------|---------------|------------|-----------------------|-----------------------|------------|
|  CustomerID   | CustomerName  | ProblemId  | ProblemDescription    |      EventReason      | EventDate  |
|---------------|---------------|------------|-----------------------|-----------------------|------------|
|    1234       | Johnathan     | 3178765    |                       | Accepted as sell back | 2019-10-05 |
|---------------|---------------|------------|-----------------------|-----------------------|------------|

我希望获取多条客户记录的结果 ~ 10K 记录。

非常感谢您的帮助。

【问题讨论】:

这与您之前的问题有何不同? @SMor 在这个问题中,我希望先扫描问题表并查找“%sell back%”标签,然后在问题事件表中找到最新的“%sell back%”条目.而在上一个问题中,我只是在问题事件表中寻找“%sell back%”标签。 【参考方案1】:

您可以使用row_number 尝试以下解决方案。这是demo。

select 
    subq.customerID,
    customerName,
    problemID,
    problemDescription,
    eventReason,
    eventDate
from
(
  select 
    customerID,      
    p.problemID,
    problemDescription,
    eventReason,
    eventDate,
    count(*) over (partition by p.problemID) as cnt,
    row_number() over (partition by p.problemID order by DateReported desc) as pbrn,
    row_number() over (partition by pe.problemID order by eventDate desc) as pern
  from problem p
  join problemEvent pe
  on p.problemID = pe.problemID
  where (problemDescription like '%sell back%'
  and eventReason like '%sell back%') 
  or eventReason like '%sell back%'
) subq
join customer c
on subq.customerID = c.customerID
where (cnt = 1
and pbrn = 1)
or pern = 1

输出:

*-------------------------------------------------------------------------------------------------*
| customerID    customerName    problemID   problemDescription  eventReason             eventDate |
*-------------------------------------------------------------------------------------------------*
|   1234         Johnathan       3178766    Sell Back Customer  Accepted as sell back  2019-08-26 |
*-------------------------------------------------------------------------------------------------*

【讨论】:

您好 @zealous 感谢您的帮助,但此查询未在问题表中找到 PorblemDescription 为空但问题中相应问题 ID 存在“%sell back%”标签的行事件表。

以上是关于跨 3 个表的多个记录的特定字符串的顺序查找并按最新条目显示的主要内容,如果未能解决你的问题,请参考以下文章

从包含 ACCESS 2013 中的多个表的表单中查找带有组合框的记录

在怎样WORD中查找含有特定内容的段落并按顺序标上123456等等

跨 3 个表的 MySQL 外键“ON DELETE CASCADE”

Postgres 使用跨 2 个表的内部连接进行更新?

如何在 ASP.NET Core API 控制器中获取多个表的记录

略微复杂的sql逻辑(从数据库逆序查找有限条记录(limit))并按相反顺序输出