C# 从多个父Id的子表中仅获取一条(最新)详细信息记录';这是一个查询
我有一个问题,老实说,我不知道这是不是可以写在良好和可读的方式 我有两张桌子 第一个是包含4列的事件: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
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
中的每一行上都是唯一的。很难说,因为数据结构相当神秘,但这是我最好的猜测。