2

我需要做一個左外連接加入這樣的:SQL:左外與條件

SELECT 
    tblProjects.*, 
    tblNotes.NoteID, 
    tblNotes.regDate AS lastUpdatedNote 
FROM 
    tblProjects 
    LEFT OUTER JOIN tblNotes ON tblProjects.ProjectID = tblNotes.ProjectID 

但是一個項目可以有幾個注意事項,並在這種情況下,我只是在一個與MAX興趣(regDate)我如何將這個條件添加到上面的SQL?或者我必須爲每個項目抓取所有註釋並過濾出最新的代碼?

所以我只想每個項目一行,在那一行我想lastUpdatedNote信息。

THX :)

+0

哪個數據庫模式是這個 – 2011-06-10 06:34:40

+0

你爲什麼使用'LEFT OUTER JOIN'?看上面的sql,註釋與項目相關聯。不是嗎? – shahkalpesh 2011-06-10 06:39:38

+0

選擇你的MAX(regDate),但只是做一個內部連接,按projectid分組 - 我假設你對沒有筆記的項目不感興趣,對嗎? – kinakuta 2011-06-10 06:41:39

回答

2

在MS SQL,你可以做這樣的事情:

SELECT 
    tblProjects.*, 
    tblNotes.NoteID, 
    tblNotes.regDate AS lastUpdatedNote 
FROM tblProjects 
OUTER APPLY 
(
    SELECT TOP 1 NoteId, regDate 
    FROM tblNotes 
    WHERE tblProjects.ProjectID = tblNotes.ProjectID 
    ORDER BY tblNotes.regDate DESC 
) tblNotes 

CROSS APPLY更換,如果你只需要擁有註釋的項目。

或CTE:

WITH cte 
AS 
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY NoteId ORDER BY RegDate DESC) RowNumber 
    FROM tblNotes 
) 
SELECT tblProjects.*, cte.NoteID, cte.RegDate 
FROM tblProjects 
    LEFT JOIN cte on 
     tblProjects .ProjectId = cte.ProjectId AND RowNumber = 1 

INNER JOIN更換,如果你只需要擁有註釋的項目。

+0

一個項目可能沒有註釋,所以它應該是LEFT JOIN。 (無論如何OP都會使用它。)並且'RowNumber = 1'應該被添加到左連接條件中。 – 2011-06-10 06:46:34

+0

@Andriy M - 謝謝。我更新了我的回答並對此作了評論。 – 2011-06-10 06:49:55

+0

您的左連接本質上仍然是一個內連接,因爲您在WHERE子句中對「RowNumber」進行篩選。 – 2011-06-10 06:53:17