1

私は完全に愚かだと感じます。私は自分のSQLで錆びています。

MessageとMessageThreadの2つのテーブルがあります。各メッセージは、ParentTHreadIDを外部キーとして使用する1つのMessageThreadに属します。あなたはおそらくこれがどこに向かっているのかを見ることができます。

さて、こういうことをしたいです。テーブル、メッセージ、スレッドの両方から列を取得したいのですが、メッセージの作成日がそのスレッドの最大値です。したがって、各レコードには、スレッド列と、そのメッセージスレッドに最後に投稿された1つのメッセージレコードの列が含まれます。

これが私がこれまでに持っているもので、すべてのスレッド列とメッセージの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をsqlに、またはlinqをnhibernateに与えることができる人を指します。

ありがとう、クレイグ

4

3 に答える 3

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};

編集あなたはあなたがメッセージからのデータも必要だと言いました。その場合は、メッセージに参加するだけです。

于 2010-04-14T00:05:32.880 に答える
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)

これには、そのスレッドの最大日付を持つ行を1つだけ選択する効果があります。また、サブクエリを実行しなくても必要な列を選択できるため、クエリで実行する必要のあるテーブルスキャンまたはインデックススキャンの数を減らすことができます。

于 2010-04-13T23:15:59.993 に答える
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 

これにより、2つのネストされたクエリを持つすべての列が取得されます。

于 2010-04-13T21:06:07.260 に答える