2012-09-28 13 views
5

私は約15の列を持つ各メンバーによって投稿されたタスクを取得するために5つのテーブルの結合があります。しかし、サンプルコードでは、私はそれらの2つのテーブルを取っただけです。JOINを使用してテーブルから最新の行を取得する方法

SELECT TOP 5 
    dbo.MemberMst.MemberID, dbo.MemberMst.fname, 
    dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description 
FROM 
    dbo.MemberMst 
LEFT JOIN 
    dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID 

出力は次のとおりです。

ここでは上記のクエリで
MemberID fname TaskMstID OnDate     Description 
3 Ursula  NULL   NULL      NULL 
84 Opeyemi 30   2012-09-18 00:00:00.000  asd 
85 test  21   2012-09-18 10:30:46.900  aaa 
85 test  22   2012-09-18 10:31:04.967  eeee 
85 test  23   2012-09-18 10:31:26.640  vvvv 

私は3つのタスクを投稿が、私は、最新であるそのメンバーから1つのタスクだけを必要とするMemberID=85ための3行を取得。その結果は次のようになりので、最新のタスクは、メンバーによって投稿を取得する方法: -

MemberID fname TaskMstID OnDate    Description 
3 Ursula  NULL  NULL     NULL 
84 Opeyemi 30  2012-09-18 00:00:00.000 asd 
85 test  23  2012-09-18 10:31:26.640 vvvv 

私は、各memberID持つタスクのためのちょうど1つのレコードのみを言うことを意味ですか?

ヘルプありがとう!

ありがとうございます...!

答えて

4

Group BY()句を使用する必要があります。

SELECT c.MemberID, c.fname, c.TaskMstID, c.OnDate, c.Description 
FROM 
    (
     SELECT a.MemberID, a.fname, 
       b.TaskMstID, b.OnDate, b.Description, 
       ROW_NUMBER() OVER (Partition BY a.MemberID ORDER BY b.OnDate DESC) RN 
     FROM MemberMst a 
       LEFT JOIN TaskMst b 
        ON a.MemberID = b.MemberID 
    ) c 
WHERE c.RN = 1 
+0

@ Johnさん、申し訳ありませんが、これは動作しません...!エラー: 'MemberID'列が 'a'に複数回指定されました。 –

+1

@SHEKHAR SHETEこの場合、明示的に列名を指定してください。 –

+1

@SHEKHARSHETEサブクエリー内の列名を明示的に指定する必要があります。私はちょうど私の答えを更新します。 –

1

あなたはちょうどあなたがSQL Server 2008を使用しているので、あなたがWindow Functionsを活用することができMAX()関数

with CTE as(
    SELECT TOP 5 
     dbo.MemberMst.MemberID, 
     dbo.MemberMst.fname, 
     dbo.TaskMst.TaskMstID, 
     dbo.TaskMst.OnDate, 
     dbo.TaskMst.Description 
    FROM 
     dbo.MemberMst left 
     JOIN dbo.TaskMst 
     ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID) 

select dbo.MemberMst.MemberID, 
     dbo.MemberMst.fname, 
     dbo.TaskMst.TaskMstID, 
     max(dbo.TaskMst.OnDate) as OnDate, 
     dbo.TaskMst.Description 
from CTE 
group by MemberID 
+0

このタイプの構文はMSSQLでは機能しません。 –

+0

@ JohnWoo:私は答えを更新しました.. Plzチェック –

3
;With Cte1 AS 
(

SELECT top 5 dbo.MemberMst.MemberID, dbo.MemberMst.fname, dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description 
FROM dbo.MemberMst left JOIN 
dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID 
), 
Cte2 As 
( SELECT Rn = Row_Number() Over(Partition by MemberId Order By OnDate Desc), * 
    From Cte1 

) 
Select * 
From Cte2 
Where Rn = 1 

あなたのための作業を行う必要があります。

はこのような何かを試してみてください。やってみて。

+0

これはCte1、Cte2 plzの説明です...これはSQLSERVER2008でエラーを返します... –

+0

エラーは発生しません。これらはSQL Server 2005.B/tから導入されている一般的なテーブル式です。取得? –

+0

エラー: 'Cte2'付近の構文が正しくありません。私はこのタイプの構文を説明する彼のPLZには新しいですか? –

1

MemberIDでパーティションを作成し、その上にランクを付けて一番上のランクのアイテムのみを選択できます。同じランクを持つ複数の行の問題を回避するために)(代わりに、RANKの はROW_NUMBER(に変更):MSDN

詳細情報は、UPDATEこの

WITH MyCte AS 
(SELECT top 5 dbo.MemberMst.MemberID, dbo.MemberMst.fname, dbo.TaskMst.TaskMstID, dbo.TaskMst.OnDate, dbo.TaskMst.Description, 
     ROW_NUMBER() OVER (PARTITION BY dbo.MemberMst.MemberID ORDER BY dbo.TaskMst.OnDate DESC) AS RowNum 
FROM dbo.MemberMst 
left JOIN dbo.TaskMst ON dbo.MemberMst.MemberID = dbo.TaskMst.MemberID) 
SELECT * 
FROM MyCte 
WHERE RowNum > 0 

のようないくつかのことを試してみてください。

関連する問題