![](/img/trans.png)
[英]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.