加入最大值和空值

Join with a max and nulls

我有 2 个表:

People:
ID |  Name
----------
1  | John
2  | David
3  | Jennifer

另一个对第一个有简单的 FK

Note:
ID | People_ID | Note
----------------------
1  |  1        | A note
2  |  1        | Another note
3  |  3        | Jen's note

我想从每个人的注释中获取与 max(ID) 关联的注释,如果没有注释则返回 null,因此所需的结果是:

People_ID | Name   | Note
----------------------------
1         |John    | Another Note
2         |David   | NULL
3         |Jennifer| Jen's Note

我可以执行联接,但不能包括 David,因为最大条件不会返回空列。有什么帮助吗?

您可以使用以下查询:

Demo

SELECT A.NAME, A.ID, MAX(B.ID)  FROM PEOPLE A LEFT OUTER JOIN NOTE B
ON (A.ID = B.PEOPLE_ID) GROUP BY A.NAME, A.ID;

那是 left join - 我会推荐 pre-aggregating 子查询中的注释:

select p.*, n.*
from people p
left join (
    select people_id, max(id) max_note_id
    from note
    group by people_id
) n on n.people_id = p.id

有些情况下横向连接会更有效:

select p.*, n.*
from people p
outer apply (
    select top(1) id max_note_id 
    from note n 
    where n.people_id = p.id
    order by id desc
) n

横向连接的好处在于,如果您愿意(比如笔记的文本,或者否则)。