[英]Getting only one record from parent with multiple child in Linq (Distinct)
[英]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.