Использование результирующего набора из подчиненного элемента SELECT при обнаружении дублирующихся строк - PullRequest
0 голосов
/ 21 февраля 2012

Прежде всего, таблица, с которой я борюсь:

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, включенным по умолчанию. Вот пастин оригинала.

1 Ответ

0 голосов
/ 21 февраля 2012

Я думаю, вы хотите что-то вроде этого:

SELECT  dl.DispatchID,
        dl.StopNumber AS NextStop,
        dl.Arrived,
        dl.Departed
FROM    DispatchLocations dl
        INNER JOIN
        (   SELECT  DispatchID, MIN(StopNumber) [StopNumber]
            FROM    DispatchLocations
            GROUP BY DispatchID
        ) MinDL
            ON MinDL.DispatchID = dl.DispatchID
            AND MinDL.StopNumber = dl.StopNumber

Это вернет детали для наименьшего стоп-номера для каждого ID отправки.Затем вы можете отфильтровать это, просто используя WHERE.Например,

WHERE  Arrived = 1
AND    Departed = 0

Я думаю, что добавление вышеприведенного к утверждению select в верхней части вернет результаты:

Dispatch_ID    NextStop    Arrived    Departed
===========    ========    =======    ========
6410           1           True       False
50589          1           True       False
50687          1           True       False

Хотя, возможно, я неправильно понял вопрос.

...