在一个查询中仅从子表中抓取多个父ID的一条(最新)详细记录

问题描述 投票:0回答:3

我有一个查询的问题,说实话,我不知道这是否有可能以良好和可读的方式写。

我有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#代码的解决方案。拳头我抓住每个EVENT的所有DETAILS_ID,然后调用另一个SQL来获取此id的所有细节,并使用LINQ garbing最新分类。从技术上讲,这项工作非常缓慢。

所以我的问题是,我可以使用一个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

谢谢。

c# sql oracle
3个回答
1
投票

您可以通过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 

0
投票

如果我正确理解了这个问题,您可以使用窗口函数来获取事件的每种类型的最新细节:

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;

0
投票

我会为此目的使用窗口函数。希望这可以帮助。谢谢。

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
© www.soinside.com 2019 - 2024. All rights reserved.