Прежде всего, таблица, с которой я борюсь:
DispatchLocations
=================
DispatchID int
StopNumber int
Arrived bool
Departed bool
Идея состоит в том, что на маршруте грузоперевозок в отправке много остановок. Это список каждого местоположения в каждой отправке (по сути, это таблица маршрутов). В этом представлении должна быть только одна отправка для каждой строки вывода, что указывает на «текущий останов», в котором находится отправка.
SELECT TOP 4
DispatchID,
Min(StopNumber) AS NextStop,
Arrived,
Departed
FROM DispatchLocations
GROUP BY
DispatchID,
Arrived, Departed
HAVING (Arrived = 0 OR Departed = 0)
ORDER BY DispatchID ASC, NextStop ASC
Вывод моего просмотра на данный момент:
Dispatch_ID NextStop Arrived Departed
=========== ======== ======= ========
3 2 False False
1356 2 False False
6410 1 True False
6410 2 False False
Последняя строка выгружается, потому что GROUP BY должен включать статус прибытия и отправления, нарушая уникальность вывода.
Нужные строки (только) можно извлечь с помощью очень похожего запроса:
SELECT
DispatchID,
Min(StopNumber) AS NextStop,
Arrived,
Departed
FROM DispatchLocations
GROUP BY
DispatchID,
Arrived, Departed
HAVING
(Arrived = 1 AND Departed = 0) AND Min(StopNumber) = 1
ORDER BY DispatchID ASC
Dispatch_ID NextStop Arrived Departed
=========== ======== ======= ========
6410 1 True False
50589 1 True False
50687 1 True False
Я подтвердил эти результаты, выбрав все DispatchIDs с моей точки зрения WHERE COUNT(DispatchID) > 1
.
Как я могу использовать результаты второго запроса, когда сталкиваюсь с соответствующими идентификаторами в представлении? Я не могу получить предложение EXIST
или EXCEPT
для работы с HAVING
, присутствующим в тексте запроса. Итак, на данный момент я беру результаты из рук базы данных и заставляю логику приложения сортировать дубликаты результатов и сохраняю только первый результат для каждого идентификатора отправки. Но я бы предпочел, чтобы база данных сделала это для меня.
UPDATE
Я использую SSMS 2008, которая создает представления с TOP 100 PERCENT
, включенным по умолчанию. Вот пастин оригинала.