1

我觉得完全愚蠢。我对我的 sql 生疏了。

我有两个表,Message 和 MessageThread。每条消息都属于一个使用 ParentTHreadID 作为外键的 MessageThread。您可能可以看到这是怎么回事。

好吧,我想做这样的事情。我想从表、消息和线程中获取列,但是消息的创建日期是该线程中的最大值。因此,每条记录都将包含线程列和一条消息记录的列,该消息记录是该消息线程中最近发布的。

到目前为止,这是我所拥有的所有线程列和消息的 ID。它可以工作,但使用子查询,我必须创建一堆其他子查询才能获取其他列。呸。

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

奖励指向不仅可以给我 sql,还可以给我 linq to sql 或 linq to nhibernate 的任何人。

谢谢,克雷格

4

3 回答 3

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)

这具有仅选择一行的效果,该行具有该线程的最大日期。此外,这意味着您可以选择所需的任何列,而不必对它们进行子查询,这减少了查询必须执行的表扫描或索引扫描的数量。

于 2010-04-13T23:15:59.993 回答
0

首先,您可以通过使用如下子查询来编写没有派生表(如在您的 OP 中)的代码:

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 的数据。在这种情况下,只需加入 Message。

于 2010-04-14T00:05:32.880 回答
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 

这应该为您提供具有两个嵌套查询的所有列。

于 2010-04-13T21:06:07.260 回答