Я пытаюсь вернуть несколько значений записей в одной строке, поэтому я хотел использовать несколько объединений в одной таблице. Мне нужно, чтобы две верхние записи отображались бок о бок. Эти объединения становятся 'LatestNote' и 'SecondLatestNote', используя RowNumber для их разделения.
Ниже приведен очень простой пример, но я не получаю результатов. Что я тут испортил?
SQL с объединениями, который не возвращает значений:
DECLARE @DateFrom AS DATETIME = CONVERT(DateTime, '2017-01-01 00:00:00.000', 120)
DECLARE @DateTo AS DATETIME = CONVERT(DateTime, '2018-01-01 00:00:00.000', 120)
SELECT
LatestNote.NoteCode,
LatestNote.NoteDate,
SecondLatestNote.NoteCode AS [NoteCode2nd],
SecondLatestNote.NoteDate AS [NotDate2nd]
FROM Locations LOC
LEFT JOIN (
SELECT TOP 2 LocationID, NoteID, Row_Number() OVER (ORDER BY Notedate DESC) AS RowNum
FROM Notes(nolock)
WHERE NoteCode = 'NOTIFY'
AND NoteDate BETWEEN @DateFrom AND @DateTo
)
AS TopTwoNotes ON TopTwoNotes.LocationID = LOC.LocationID
LEFT JOIN Notes AS LatestNote ON LatestNote.NoteID = TopTwoNotes.NoteID AND TopTwoNotes.RowNum = 1
LEFT JOIN Notes AS SecondLatestNote ON SecondLatestNote.NoteID = TopTwoNotes.NoteID AND TopTwoNotes.RowNum = 2
WHERE LOC.LocationID = 308644
Результат - все NULL, строка возвращается только потому, что я использую LEFT JOIN. Почему это не работает ??
Этот SQL показывает, что данные есть, с результатами ниже:
SELECT TOP 2 LocationID, NoteID, Row_Number() OVER (ORDER BY NoteDate DESC) AS RowNum
FROM Notes(nolock)
WHERE NoteCode = 'NOTIFY'
AND NoteDate BETWEEN @DateFrom AND @DateTo
AND LocationID = 308644
LocationID NoteID RowNum
308644 10291348 1
308644 10130566 2
SELECT
NoteID,
NoteCode,
NoteDate,
LEN(CAST(Note AS VARCHAR(8000))) AS [NoteCharCount]
FROM
Notes
WHERE
LocationID = 308644
AND NoteDate BETWEEN @DateFrom AND @DateTo
NoteID NoteCode NoteDate NoteCharCount
10130566 NOTIFY 2017-11-08 50
10291348 NOTIFY 2017-12-13 66
Должно быть, я что-то упустил - я не могу присоединиться, используя rownum, как это?
Спасибо за вашу помощь.