繁体   English   中英

SQL - Select 一对多关系的最大和最小行

[英]SQL - Select max and min rows from one-to-many relationship

我有三个表以以下一对多关系连接:A+B -> 一对多,B+C -> 一对多。 对于每个条目,AI 都希望获得其所有 B 条目以及它们连接的两个 C 条目,表示max(C.created)min(C.created)

A:

+-----+
| id  | 
+-----+
|0.   |
+-----+

乙:

+---------------+
| id   | A_id  |
+---------------+
|1.    | 0.    |
|2.    | 0.    |
+---------------+

C:

+--------------------------+
| id  | B_id   | created   |
+--------------------------+
|3    | 1      | 2010
|4    | 1      | 2015
|5    | 1      | 2020
|6    | 2      | 2011
|7    | 2      | 2015
|8    | 2      | 2014
+--------------------------+

结果:

+--------------------------+
| A_id  | C_id   | created|
+--------------------------+
|0       | 3      | 2010
|0       | 5      | 2020
|0       | 6      | 2011
|0       | 7      | 2015
+--------------------------+

这就是我失败的尝试的样子,我只是不能让它像我想的那样工作:

select A.id, C.id, C.created
from A
join B on (A.id = B.A_id)
join (select *
      from C
            where C.created = (select min(created) from C) or
                  C.created = (select max(created) from C)
) as foo
on B.id = foo.B_id

您的数据看起来像c具有指向b的链接,而不是a 假设是这种情况,您可以使用 window 函数:

select a.*, b.*, c.*
from a join
     b
     on b.a_id = a.id join
     (select c.*,
             row_number() over (partition by c.b_id order by c.created) as seqnum_asc,
             row_number() over (partition by c.b_id order by c.created desc) as seqnum_desc
      from c
     ) c
     on b.id = c.b_id and
        1 in (seqnum_asc, seqnum_desc);

你的查询应该是

select A.id, foo.id, foo.created
from A
join B on (A.id = B.A_id)
join (select *
      from C
            where C.created = (select min(created) from C as C1 where C.B_id=C1.B_id) or
                  C.created = (select max(created) from C as C1 where C.B_id=C1.B_id)
) as foo
on B.id = foo.B_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM