小编典典

子查询返回每个父ID的最新条目

sql

我有一个带有文档条目的父表,还有一个历史记录表,每次用户访问其中一个文档时,该表都会记录一个审计条目。

我正在编写一个搜索查询,以返回具有最新用户ID的文档列表(按各种条件过滤),以访问结果集中返回的每个文档。

因此对于

    DOCUMENTS
    ID | NAME
    1  | Document 1
    2  | Document 2
    3  | Document 3
    4  | Document 4
    5  | Document 5

    HISTORY
    DOC_ID | USER_ID | TIMESTAMP
    1      | 12345   | TODAY
    1      | 11111   | IN THE PAST
    1      | 11111   | IN THE PAST
    1      | 12345   | IN THE PAST
    2      | 11111   | TODAY
    2      | 12345   | IN THE PAST
    3      | 12345   | IN THE PAST

我希望从搜索中获得回报,例如

    ID | NAME       | LAST_USER_ID
    1  | Document 1 | 12345
    2  | Document 2 | 11111
    3  | Document 3 | 12345
    4  | Document 4 | 
    5  | Document 5 |

我可以轻松地通过一个SQL查询以及两个表之间的联接来做到这一点吗?


阅读 156

收藏
2021-04-28

共1个答案

小编典典

修改Andy White产生的内容,并用DB2(和ISO标准SQL)“定界标识符”替换方括号(MS SQL Server表示法):

SELECT d.id, d.name, h.last_user_id
    FROM Documents d LEFT JOIN
         (SELECT r.doc_id AS id, user_id AS last_user_id
              FROM History r JOIN
                   (SELECT doc_id, MAX("timestamp") AS "timestamp"
                        FROM History
                        GROUP BY doc_id
                   ) AS l
                   ON  r."timestamp" = l."timestamp"
                   AND r.doc_id      = l.doc_id
         ) AS h
         ON d.id = h.id

我不确定“时间戳”或“时间戳”是否正确-可能是后者。

这样做的好处是,它用更简单的非相关子查询替换了Andy版本中的内部相关子查询,这有可能(根本上)提高效率。

2021-04-28