【问题标题】:Join with a max and nulls加入最大值和空值
【发布时间】:2020-12-28 07:10:21
【问题描述】:

我有 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

我想从每个人的 Note 中获取与 max(ID) 关联的便笺,如果没有便笺,则为 null,因此所需的结果是:

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

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

【问题讨论】:

  • 左连接和row_number,按id分区,按noteId排序。仅选择 1 行。 Ms docs有很好的描述和row_number的例子
  • 请向我们展示您的尝试。
  • 抱歉,我可以更改问题吗(我知道,格式错误) - 我想要的是笔记本身,而不是结果中的 MaxNoteID

标签: sql-server subquery max left-join greatest-n-per-group


【解决方案1】:

这是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 表中的顶部匹配记录中引入更多列(例如注释的文本,或者其他)。

【讨论】:

  • 感谢您的努力和道歉,我真的很想写出实际的注释 - 已经改变了最初的问题
  • @GreigM:我怀疑这一点。使用横向连接解决方​​案;您只需将select top(1) id as max_note_id ...` 更改为select top(1) * ...,即可从note 表中获取整个对应行。
【解决方案2】:

您可以使用以下查询:

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;

【讨论】:

  • 感谢您的努力和道歉,我真的想要实际的说明 - 已经改变了最初的问题。之前没用过sqlfiddle,很好用
猜你喜欢
  • 2021-04-07
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2017-07-19
  • 2023-04-02
相关资源
最近更新 更多