2010-04-13 6 views
1

나는 완전히 어리 석다. 내 SQL에 녹슬 었어.SQL 그룹별로 and join

두 개의 테이블 Message 및 MessageThread가 있습니다. 각 메시지는 ParentTHreadID를 외래 키로 사용하여 하나의 MessageThread에 속합니다. 아마도 이것이 어디로 가고 있는지 알 수있을 것입니다.

음, 이렇게하고 싶습니다. 테이블, 메시지 및 스레드 모두에서 열을 가져오고 싶지만 메시지의 작성 날짜는 해당 스레드에서 최대 값입니다. 따라서 각 레코드에는 해당 메시지 스레드에 가장 최근에 게시 된 하나의 메시지 레코드에 대한 스레드 열과 열이 포함됩니다.

여기는 모든 스레드 열과 메시지 ID를 가져 오는 기능입니다. 그것은 작동하지만 하위 쿼리를 사용하고 다른 하위 열을 가져 오려면 다른 하위 쿼리를 만들어야합니다. 왝. 자 NHibernate에 대한 SQL 또는 LINQ 만 나에게 SQL을 줄 수 사람, 그러나 LINQ에

select t.*, (select top 1 m.ID from Message m where m.ParentThreadID = t.ID order by DateCreated desc) as MessageID
from MessageThread t

보너스 포인트.

감사합니다, 크레이그

답변

0

해결책 : 더 하위 쿼리!

select * from (
    select t.*, (
     select top 1 ID 
     from Message 
     where ParentThreadID = t.ID 
     order by DateCreated desc 
    ) as MessageID 
    from MessageThread t 
) tm 
    left join Message m on tm.MessageID = m.ID 

두 개의 중첩 된 쿼리가있는 모든 열을 가져와야합니다.

+0

나는 이것이 linq에서 꽤 불가능하다고 생각하십니까? – fregas

+0

아마,하지만 난 정말 linq에 유창하지 않습니다. – Blorgbeard

0

어떻게 것 당신을 위해이 작품 :

이 한 행, 해당 스레드의 최대 날짜를 가지고있는 하나를 선택하는 효과가 있습니다
SELECT (whateverYouWant) 
FROM Message m, MessageThread mt 
WHERE m.ParentThreadID = mt.ID 
AND mt.DateCreated = (SELECT MAX(mt2.DateCreated) 
         FROM MessageThread mt2 
         WHERE mt2.ID= mt.ID) 

. 또한 서브 쿼리하지 않고도 원하는 열을 선택할 수 있으므로 쿼리가 수행해야하는 테이블 스캔 또는 인덱스 스캔 수가 줄어 듭니다.

0

첫째, 당신은 (당신의 영업 이익 등)과 같이 하위 쿼리를 사용하여 파생 테이블없이 쓸 수 있습니다 :

Select ... 
From MessageThread As T 
Where Id = (
      Select TOP 1 M.Id 
      From Message As M 
      Where M.ParentThreadId = T.Id 
      Order By DateCreated Desc 
      ) 

등가 LINQ가 될 것 같은 뭔가 :

var query = from messageThread in MessageThread 
       join message in Message on message.ParentThreadId == messageThread.Id 
       let first = (messages.Where(m => m.ParentThreadId == messageThread.Id).OrderByDescendng(m => m.DateCreated).First().Id) 
       where messageThread.Id == first 
       select new {MessageThread = messageThread, Message = Message}; 

편집 당신은 당신도 메시지의 데이터가 필요하다고 언급했다. 어떤 경우에는 단순히 Message에 가입하십시오.

+0

messagethread와 메시지가 모두 필요하지만 메시지는 해당 스레드에서 가장 최근의 메시지 1 위일 필요가 있습니다. 그래서 새로운 {messageThread, message}를 선택하셔야합니다. – fregas

+0

@fregas - 그렇다면 단순히 Message에 가입하십시오. – Thomas