Подзапрос, возвращающий более 1 строки: SQL Сервер - PullRequest
0 голосов
/ 03 мая 2020

Подзапрос, возвращающий более 1 строки.

Мой текущий SQL Запрос к серверу выглядит следующим образом

SELECT DISTINCT AST.AssetName
    ,ReleaseDt
    ,ExpiresDt
    ,TicketNumber
    ,ChangeDt
    ,ChangeReasonCd
FROM pmm.pmmreleaserequest PRR WITH (NOLOCK)
LEFT JOIN pmm.PmmManagedAccount AS PMA WITH (NOLOCK) ON PRR.ManagedAccountID = PMA.ManagedAccountID
LEFT JOIN dbo.ManagedEntity AS ME WITH (NOLOCK) ON PRR.ManagedSystemID = ME.ManagedEntityID
LEFT JOIN dbo.Asset AS AST WITH (NOLOCK) ON ME.AssetID = AST.AssetID
LEFT JOIN pmm.PmmLogChange AS PLC WITH (NOLOCK) ON PRR.ManagedAccountID = PLC.ManagedAccountID
    AND PRR.ExpiresDt < PLC.ChangeDt
ORDER BY PLC.ChangeDt ASC

И в настоящее время мой вывод выглядит следующим образом.

AssetName       ReleaseDt           ExpiresDt           TicketNumber    ChangeDt            ChangeReasonCd    
DummyAsset66    2020-05-02 17:45:38 2020-05-02 17:45:52 dummyticketx1   2020-05-02 17:50:06 U    
***DummyAsset66 2020-05-02 17:45:38 2020-05-02 17:45:52 dummyticketx1   2020-05-02 18:26:06 U***    
DummyAsset66    2020-05-02 18:23:12 2020-05-02 18:23:59 dummyticketx2   2020-05-02 18:26:06 U

Я не хочу печатать вторую строку в одиночку, но все же нужна 3-я строка из выходных данных, ниже Left Join возвращает более одной строки. Я хочу взять первый ряд в одиночку.

LEFT JOIN pmm.PmmLogChange AS PLC With (nolock) ON PRR.ManagedAccountID = PLC.ManagedAccountID and PRR.ExpiresDt < PLC.ChangeDt

1 Ответ

0 голосов
/ 03 мая 2020

Если я правильно понял, вы хотите дедуплицировать ваш набор результатов по определенному набору столбцов (очевидно, по AssetName и TicketNumber). Поскольку SQL на сервере отсутствует оператор DISTINCT ON, я предлагаю вам использовать следующий прием, как описано здесь

Вы в основном заполняете каждую строку в своей проекции номером строки, таким как ROW_NUMBER() OVER(PARTITION BY <whatever columns you consider as deduplication keys like AssetName,TicketNumber, ...>), затем отфильтруйте все строки с помощью ROW_NUMBER() > 1 вместо оператора DISTINCT. И, кстати, я согласен с @marc_s, вам не следует использовать NOLOCK, как вы делаете.

Но если проблема только в последнем соединении, вы можете заменить его на подзапрос, подобный этому (SELECT TOP 1 ... FROM pmm.PmmLogChange AS PLC WHERE PRR.ManagedAccountID = PLC.ManagedAccountID AND PRR.ExpiresDt < PLC.ChangeDt ORDER BY PLC.ChangeDt ASC) AS mngac

...