簡體   English   中英

在一個查詢中僅從子表中獲取一個(最新的)詳細記錄以獲取多個父ID

[英]Grabbing only one ( newest ) detail record from child table for multiple parent Id's in one query

我對一個查詢有疑問,說實話,我什至不知道這是否有可能以良好和可讀的方式編寫。

我有2張桌子。

首先是具有4列的事件:

EVENT_ID | EVENT_TYPE | DETAIL_TYPE | DETAIL_ID

第二個表是EVENT_DETAIL,具有10多個列,但我們只需要其中3列:

DETAIL_ID | ..... | TIME | DESCRIPTION.

在當前情況下,我們將事件存儲在EVENT表中。 每個事件可以具有多種類型的多個詳細信息。

我需要做的是獲取具有最新EVENT_DETAIL.TIME的EVENT_ID的描述描述

我創建了此SQL,也許看起來不太好,但至少可以正常工作:

SELECT * FROM EVENT_DETAIL ED
WHERE ED.DESCRIPTION IN
(SELECT * FROM
( SELECT ED.DESCRIPTION
FROM EVENT_DETAIL ED
JOIN EVENT E ON ED.DETAIL_ID = E.DETAIL_ID AND 
E.EVENT_ID = 10 AND E.EVENT_TYPE  = 1 AND  E.DETAIL_TYPE = 1
WHERE ROWNUM = 1
ORDER BY ED.TIME DESC)); 

問題是,在該SQL中,我只能傳遞一個EVENT_ID(我知道我可以多次加入它,但我認為這不是一個好主意),並且我需要運行此查詢,例如十個EVENT(EVENT_TYPE和DETAIL_TYPE在整個時間都相同)。

在當前產品中,我有C#代碼解決方案。 拳頭我抓住每個事件的所有DETAILS_ID,然后調用另一個SQL來獲取此ID的所有詳細信息,並使用LINQ garging最新對其進行排序。 從技術上講這項工作很慢。

所以我的問題是,我可以通過一條SQL語句來獲取我傳遞的每個EVENT_ID的最新描述(每個EVENT_ID的EVENT_TYPE和DETAIL_TYPE都相同)嗎?

所以對於像這樣的數據:

活動:

10    |    1    |    1    |    1
10    |    1    |    1    |    2
10    |    1    |    1    |    3
11    |    1    |    1    |    5
11    |    1    |    1    |    6
11    |    1    |    1    |    7

EVENT_DETAIL:

1     |    12-12-2013    |    TEST1    
2     |    12-13-2013    |    TEST2    
3     |    12-14-2013    |    TEST3      
5     |    12-13-2013    |    TEST4    
6     |    12-14-2013    |    TEST5   
7     |    12-15-2013    |    TEST6     

和參數EVENT_ID in (10,11) , EVENT_TYPE = 1 , DETAIL_TYPE = 1

我想要類似的結果:

3    |    TEST3
7    |    TEST6

謝謝。

您可以通過detail_id與max(ed.time)組一起使用聯接

select * from 
FROM EVENT_DETAIL ED 
inner join (
      select ED.DETAIL_ID,   max(ED.TIME) max_time
      FROM EVENT_DETAIL ED
      JOIN EVENT E ON ED.DETAIL_ID = E.DETAIL_ID 
      group by ED.DESCRIPTION 
) T.DETAIL_ID = ED.DETAIL_ID  AND ED.TIME = T.max_time 

如果我對問題的理解正確,則可以使用窗口函數獲取事件每種類型的最新詳細信息:

SELECT *
FROM (SELECT ED.*,
             ROW_NUMBER() OVER (PARTITION BY E.EVENT_ID, E.DETAIL_TYPE ORDER BY ED.TIME DESC) as seqnum
      FROM EVENT_DETAIL ED JOIN
           EVENT E
           ON ED.DETAIL_ID = E.DETAIL_ID
     ) ED
WHERE seqnum = 1;

為此,我將使用開窗功能。 希望這可以幫助。 謝謝。

select EVENT_ID, 
       DESCRIPTION
from (  
    select E.EVENT_ID, 
           ED.DESCRIPTION,
           row_number() over (partition by DETAIL_ID order by TIME desc) as rnum
    from EVENT E
    join EVENT_DETAIL ED 
    on (ED.DETAIL_ID = E.DETAIL_ID)) t
where t.rnum = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM