2012-09-28 19 views
5

Mam dołączyć do 5 tabel, aby uzyskać zadania opublikowane przez każdego członka mającego około 15 kolumn. Ale dla przykładowego kodu zrobiłem tylko dwie tabele z nich.Jak uzyskać najnowszy wiersz z tabeli przy użyciu 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 

wyjściowa wynosi:

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 

Tutaj w powyższym zapytaniu mam 3 rzędy dla MemberID=85 który opublikował 3 zadania, ale muszę tylko jedno zadanie z tego członka, który jest późniejsza. Jak uzyskać najnowszy zadanie zamieszczonych przez członka tak, że wynik będzie wynosić: -

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 

mogę powiedzieć po prostu tylko jeden rekord dla każdego memberID o zadaniach?

Pomoc doceniona ..!

Z góry dziękuję ...!

Odpowiedz

4

Ponieważ używasz SQL Server 2008, można skorzystać z Window Functions.

spróbować czegoś takiego:

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

Przykro mi to mówić @John, ale to nie działa ...! Błąd: Kolumna 'MemberID' została określona wiele razy dla "a". –

+1

@ SHOWHAR SHETE, W takim przypadku należy podać nazwy kolumn jawnie –

+1

@SHEKHARSHETE należy jawnie określić nazwy kolumn w podzapytaniu. Po prostu zaktualizuję moją odpowiedź. –

1

po prostu trzeba KORZYSTAĆ Group BY() Clause z MAX() Funkcja

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

ten typ składni nie zadziała na MSSQL. –

+0

@JohnWoo: Zaktualizowałem swoją odpowiedź .. Czek 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 

powinien wykonać zadanie dla Ciebie. Wypróbuj to.

+0

co to jest Cte1, Cte2 plz wyjaśnić ... to daje błąd w SQLSERVER2008 ... –

+0

Nie powinieneś dostać błędu .. To jest typowe wyrażenie tabeli wprowadzane z Sql Server 2005.B/t, jaki jest błąd, który jesteś dostawać? –

+0

Błąd: Niepoprawna składnia w pobliżu "Cte2". Jestem nowy w jego plz wyjaśnić ten typ składni? –

1

Można podzielić na partycje według identyfikatora uczestnika, a następnie obrać pozycję nad nim i wybrać tylko najwyższą pozycję w rankingu.

Więcej informacji na MSDN

Spróbować coś takiego

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 

UPDATE: Zmieniono ROW_NUMBER() zamiast RANK(), aby uniknąć problemu wielu wierszy z tej samej rangi.

Powiązane problemy