C# 从多个父Id的子表中仅获取一条(最新)详细信息记录';这是一个查询

C# 从多个父Id的子表中仅获取一条(最新)详细信息记录';这是一个查询,c#,sql,oracle,C#,Sql,Oracle,我有一个问题,老实说,我不知道这是不是可以写在良好和可读的方式 我有两张桌子 第一个是包含4列的事件: EVENT_ID | EVENT_TYPE | DETAIL_TYPE | DETAIL_ID 第二个表是EVENT_DETAIL,有10多列,但我们只需要其中的3列: DETAIL_ID | ..... | TIME | DESCRIPTION. 在当前场景中,我们将事件存储在事件表中。每个事件可以具有多个类型的多个详细信息 我需要做的是获取具有最新EVENT\u DETAIL.TIME

我有一个问题,老实说,我不知道这是不是可以写在良好和可读的方式

我有两张桌子

第一个是包含4列的事件:

EVENT_ID | EVENT_TYPE | DETAIL_TYPE | DETAIL_ID
第二个表是EVENT_DETAIL,有10多列,但我们只需要其中的3列:

DETAIL_ID | ..... | TIME | DESCRIPTION.
在当前场景中,我们将事件存储在事件表中。每个事件可以具有多个类型的多个详细信息

我需要做的是获取具有最新EVENT\u DETAIL.TIME的EVENT\u 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\u ID(我知道我可以多次加入它,但我认为这不是一个好主意),我需要运行这个查询,例如十个EVENT(EVENT\u TYPE和DETAIL\u TYPE在整个时间内都是相同的)

在当前产品中,我有C代码的解决方案。首先,我获取每个事件的所有详细信息\u ID,然后调用另一个
SQL
获取该ID的所有详细信息,并使用
LINQ
garbing latest对其进行排序。从技术上讲,这是一项工作,但速度非常缓慢

所以我的问题是,我可以用一条SQL语句来获取我传递的每个事件ID的最新描述吗(每个事件ID的事件类型和细节类型都是相同的)

因此,对于以下数据:

活动:

10    |    1    |    1    |    1
10    |    1    |    1    |    2
10    |    1    |    1    |    3
11    |    1    |    1    |    5
11    |    1    |    1    |    6
11    |    1    |    1    |    7
活动详情:

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     
(10,11)中的参数
EVENT\u ID,EVENT\u TYPE=1,DETAIL\u TYPE=1

我希望得到如下结果:

3    |    TEST3
7    |    TEST6

谢谢

您可以按详细信息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

我只是想了解,你有多个事件。每个事件可以有多个事件详细信息。是否要传递一个查询以获取事件的最新事件详细信息?我要传递一个查询以仅获取每个事件的最新(按时间排序)事件详细信息。我将按问题编辑以解释此问题。问题很好,我错过了键入的问题。我编辑了它,但您没有及时看到它。抱歉。
事件详细信息
为什么没有
事件ID
?我无法理解数据结构。样本数据和期望的结果会有所帮助。我用样本数据编辑了我的问题。我认为这行不通,因为我认为
DETAIL\u ID
EVENT\u DETAIL
中的每一行上都是唯一的。很难说,因为数据结构相当神秘,但这是我最好的猜测。