问题描述
我有2张桌子:
People:
ID | Name
----------
1 | John
2 | David
3 | Jennifer
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,因为最大条件不会带回null列。有什么帮助吗?
解决方法
那是left join
-我建议在子查询中预先汇总注释:
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
关于横向联接的好处是,您可以根据需要轻松地从note
表的顶部匹配记录中获取更多列。
您可以使用以下查询:
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;