SQL:带有条件的左外连接

时间:2011-06-10 06:32:36

标签: sql sql-server tsql sql-server-2008 common-table-expression

我需要像这样做一个左外连接:

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

但是一个项目可以有几个注释,在这种情况下我只对MAX(regDate)的一个感兴趣如何将这个条件添加到上面的sql?或者我是否必须获取每个项目的所有注释并过滤掉最新的代码?

所以我只希望每个项目有一行,在那行中我想要lastUpdatedNote信息。

Thx:)

1 个答案:

答案 0 :(得分: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