Выберите несколько записей из таблицы базы данных sql в сценарии master-detail - PullRequest
1 голос
/ 29 мая 2010

У меня есть две таблицы в отношениях мастер-детали. Структура более или менее выглядит следующим образом: Мастер стол:

MasterID, DetailID, date, ...
masterID1, detailID1, 2010/5/1, ....
masterID2, detailID1, 2008/6/14, ...
masterID3, detailID1, 2009/5/25, ...
masterID4, detailID2, 2008/7/24, ...
masterID5, detailID2, 2010/4/1, ...
masterID6, detailID4, 2008/9/16, ...

Таблица подробностей:

DetailID, ...
detailID1, ...
detailID2, ...
detailID3, ...
detailID4, ...

Мне нужно получить все записи из таблицы сведений и последнюю запись из основной таблицы (последняя по дате в основной таблице). Как это:

detailID1, masterID1, 2010/5/1, ....
detailID2, masterID5, 2010/4/1, ...
detailID3, null, null, ...
detailID4, masterID6, 2008/9/16, ...

Понятия не имею, как это сделать. Кто-нибудь может мне помочь? Большое спасибо. Jan

1 Ответ

1 голос
/ 29 мая 2010
Select ....
From Details As D
    Left Join   (
                Select M1.MasterId, M.DetailId, M.Date...
                From Master As M1
                Where MasterId  = (
                                    Select Max(M2.MasterId)
                                    From Master As M2
                                    Where M2.DetailId = M1.DetailId
                                    Group By M2.DetailId
                                    Having Max(M2.Date) = M1.Date
                                    )
                ) As M
        On M.DetailId = D.DetailId

То, что я делаю здесь, имеет дело со связями. Если у вас было две мастер-строки с одинаковым DetailId и датой, я выбираю ту, которая имеет самый высокий MasterId.

Кстати, эта проблема значительно проще, если у вас есть общие табличные выражения (CTE). С CTE вы можете сделать что-то вроде:

With LastMasterRows As
                (
                Select MasterId, DetailId, Date
                    , Row_Number() Over( Partition By DetailId Order By Date, MasterId ) As ItemRank
                From Master
                )
Select ...
From Details As D
    Left Join LastMasterRows As M
        On M.DetailId = D.DetailId
            And M.ItemRank = 1
...