SQL SRVR 2016: проблема с присоединением к вложенному оператору выбора - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю в окне запроса в SSMS.

Использование 3 таблиц:

  • WORK_ORDER wo
    • Заказ на изготовление детали
  • ОПЕРАЦИЯ op
    • Операция по изготовлению детали (лазерная обработка, шлифование, покрытие и т. Д.)
  • PART pt
    • Уникальная запись, определяющая деталь

Моя цель - сообщить о состоянии операции (скажем, № 3) (# заказано всего деталей, # выполненочастей), но дополнительно включить в последовательность количество частей, которые завершили предыдущую операцию (# 2) и готовы к процессу.Мое решение состояло в том, чтобы использовать функцию LAG, которая отлично работает, когда вложенный оператор select, выполняемый ниже, выполняется независимо, но я получаю среднее 4-кратное дублирование в моих результатах, и мой столбец Completed_QTY_PREV_OP не отображается.Я знаю, что это потому, что это не в родительском операторе выбора, но я сначала хотел исправить соединение.Я предполагаю, что эти две проблемы связаны между собой.

Сноска: WHERE содержит фильтр, который вы можете игнорировать.Родительский оператор выбора отлично работает без присоединенного подзапроса.

Вот мой sql:

SELECT  op.RESOURCE_ID, pt.USER_5 AS PRODUCT, wo.PART_ID, wo.TYPE, wo.BASE_ID, 
        wo.LOT_ID, wo.SPLIT_ID, wo.SUB_ID, op.SEQUENCE_NO, pt.DESCRIPTION, 
        wo.DESIRED_QTY, op.FULFILLED_QTY AS QTY_COMP, op.SERVICE_ID, op.DISPATCHED_QTY, wo.STATUS

FROM dbo.WORK_ORDER wo INNER JOIN
        dbo.OPERATION op ON wo.TYPE = op.WORKORDER_TYPE
        AND wo.BASE_ID = op.WORKORDER_BASE_ID 
        AND wo.LOT_ID = op.WORKORDER_LOT_ID
        AND wo.SPLIT_ID = op.WORKORDER_SPLIT_ID 
        AND wo.SUB_ID = op.WORKORDER_SUB_ID INNER JOIN
            dbo.PART pt ON wo.PART_ID = pt.ID

        LEFT OUTER JOIN 
            --The nested select statement works by itself in a query window,
            --but the JOIN throws an error.
            (SELECT 
                pr.WORKORDER_TYPE, pr.WORKORDER_BASE_ID, pr.WORKORDER_LOT_ID, 
                pr.WORKORDER_SPLIT_ID, pr.WORKORDER_SUB_ID, pr.SEQUENCE_NO,
                LAG (COMPLETED_QTY, 1) OVER (ORDER BY pr.WORKORDER_TYPE, pr.WORKORDER_BASE_ID, 
                pr.WORKORDER_LOT_ID, pr.WORKORDER_SPLIT_ID, pr.WORKORDER_SUB_ID, pr.SEQUENCE_NO) AS COMP_QTY_PREV_OP
            FROM dbo.OPERATION AS pr) AS prev
            --End of nested select 

            ON
                op.WORKORDER_TYPE = prev.WORKORDER_TYPE AND
                op.WORKORDER_BASE_ID = prev.WORKORDER_BASE_ID AND
                op.WORKORDER_LOT_ID = prev.WORKORDER_LOT_ID AND
                op.WORKORDER_SPLIT_ID = prev.WORKORDER_SPLIT_ID AND
                op.WORKORDER_SUB_ID = prev.WORKORDER_SUB_ID

WHERE (NOT (op.SERVICE_ID IS NULL)) AND (wo.STATUS = N'R')

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

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

Теперь работает отлично.Спасибо за поиск.

PS: Я прошу прощения за путаницу по поводу сообщения об ошибке.После того, как я написал, я заметил, что у меня есть старый комментарий в коде об ошибке.Ошибка была исправлена ​​перед публикацией, но я забыл удалить комментарий.

0 голосов
/ 27 февраля 2019

Вы не предоставили достаточно информации для окончательного ответа, поэтому вместо этого я дам вам подход к отладке этого.

Вы получаете неожиданные строки в результате JOIN.Это означает, что ваше условие JOIN не соответствует двум сторонам JOIN в отношении один к одному.В соединяемой таблице есть несколько строк, которые удовлетворяют условиям JOIN.

Чтобы найти эти строки, временно измените список SELECT на SELECT *.Делайте это как во внешнем SELECT, так и в производной таблице.Просмотрите столбцы, возвращаемые таблицей JOINed, и найдите значения, которые вы не ожидали получить.

Поскольку СОЕДИНЕНИЕ, которое вызывает проблему, является последним, они будут полностью справа от результата SELECT *.

Затем добавьте больше условий в СОЕДИНЕНИЕ, чтобы устранитьнежелательные строки из результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...