2011-12-27 3 views
0

を必要とする、私はこの記事で説明したものから、カーソル作成:SQL - Call Stored Procedure for each record、セットベースのソリューション

をしかし、私が本当にしたいことはセットベースのソリューションです。チケットとワークログの2つのテーブルがあります。 各チケットは複数のワークログを持つことができます。チケットごとに最新のチケットが必要です。

SELECT WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID, 
      Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority, 
      Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent 
FROM Ticket INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef 

私は何とかSELECT TOP (1) _WorkLog_ FROM WorkLog ORDER BY WorkLogID DESC各Ticket.IDのチケットで、私は私が探しているセットを持っているだろうことができれば。 CROSS APPLYを使って同様の解決策を見ましたが、どの機能を適用する必要があるのか​​よくわかりません。

私の頭脳をOOギアから抜き出す助けがあれば、大歓迎です。

答えて

1

を用いて達成することができます。

1)NOTは

SELECT WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID, 
      Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority, 
      Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent 
FROM Ticket INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef 
WHERE not exists (SELECT 1 FROM WorkLog w2 WHERE w2.TicketIDRef = Ticket.ID AND w2.WorkLogDate > WorkLog.WorkLogDate) 

2)サブ

SELECT 
     (
     SELECT TOP 1 
      WorkLog.TextEntry 
     FROM 
      WorkLog 
     WHERE 
      Ticket.ID = WorkLog.TicketIDRef 
     ORDER BY 
      WorkLog.WorkLogDate DESC 
     ) as TextEntry, 
     Ticket.ID, 
     Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority, 
     Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent 
FROM Ticket 

3)は、同様ROW_NUMBERソリューションの

SELECT WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID, 
      Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority, 
      Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent 
FROM Ticket 
     INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef 
     INNER JOIN (
        SELECT 
         max(WorkLogDate), 
         TicketIDRef 
        FROM 
         WorkLog w2 
        GROUP BY 
         TicketIDRef 
        ) wMax ON 
      WorkLog.WorkLogDate = wMax.WorkLogDate AND 
      wMax.TicketIDRef = WorkLog.TicketIDRef 
+0

ありがとうJake!これらのソリューションのそれぞれのパフォーマンスを測定する最も簡単な方法は何でしょうか?私は彼らがすべて私のカーソルベースのソリューションよりも優れた性能を発揮すると確信しています! – aBerrantJots

+0

SSMS内では、これらのそれぞれの実行計画を表示し、どちらがより高価な操作を行うかを確認することができます。また、大規模なデータセットに対してそれらをすべて実行し、応答時間を比較するだけでよい指標になります。 –

0

何を探してるんですが、それを行うにはいくつかの方法がありますROW_NUMBER関数

SELECT ROW_NUMBER() OVER (PARTITION BY Ticket.ID ORDER BY WorkLog.ID DESC) rowNumber, 
     WorkLog.WorkLogDate, WorkLog.TextEntry, Ticket.ID, 
     Ticket.Summary, Ticket.Requester, Ticket.Status, Ticket.Priority, 
     Ticket.AssignedTo, Ticket.DateResolved, Ticket.TimeSpent 
FROM Ticket 
    INNER JOIN WorkLog ON Ticket.ID = WorkLog.TicketIDRef 
WHERE rowNumber 1 
+0

感謝を参加選択EXISTS! – aBerrantJots

関連する問題