SQL: левое внешнее соединение с условиями - PullRequest
2 голосов
/ 10 июня 2011

Мне нужно сделать левое внешнее объединение следующим образом:

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 Ответ

2 голосов
/ 10 июня 2011

В 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, если вам нужны только те проекты, у которых есть заметки.

...