簡體   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