[英]Oracle SQL - join table in one-to-many relationship, but instead of duplicating rows show min/max
[英]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.