加入最大值和空值
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,因为最大条件不会返回空列。有什么帮助吗?
您可以使用以下查询:
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
横向连接的好处在于,如果您愿意(比如笔记的文本,或者否则)。
我有 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,因为最大条件不会返回空列。有什么帮助吗?
您可以使用以下查询:
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
横向连接的好处在于,如果您愿意(比如笔记的文本,或者否则)。