我有一个带有文档条目的父表,还有一个历史记录表,每次用户访问其中一个文档时,该表都会记录一个审计条目。
我正在编写一个搜索查询,以返回具有最新用户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查询以及两个表之间的联接来做到这一点吗?
修改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版本中的内部相关子查询,这有可能(根本上)提高效率。