Введение
Привет всем, я пытаюсь получить большой выбор, но у меня есть принципиальная проблема, этот запрос занимает более 55 секунд, чтобы отобразить 13 000 строк, потому что есть 4 подзапроса (поиск к одной и той же таблице):
- СВЯЗЬ С РОДИТЕЛЕМ ТАК АВТО
- СВЯЗЬ С РОДИТЕЛЕМ ТАК ЛИНИЯ АВТО
- ДАТА СОЗДАНА PLSO AUT
- PLSOAUT SHIPPED DATE
Эти 4 столбца будут получать данные только тогда, когда DEM_TYPE равен 'WO' , поэтому я и включаю каждый подзапрос CASE WHEN .
Если DEM_TYPE не 'WO', эти 4 столбца будут NULL
Мне просто нужна первая строка, найденная в подпрограмме-просмотр, вот почему я использовал TOP 1.
Далее я покажу вам запрос и результат таблицы
CREATE UNIQUE INDEX IDX_TMP
ON ENT_DEMAND_SUPPLY(ROWID);
SELECT ONE.ROWID, ONE.PLANNER, ONE.BUYER, ONE.DEM_TYPE, ONE.DEM_SOURCE, ONE.DEM_SOURCE_LINE, ONE.DEM_PART_ID, ONE.[PART ID DESCRIPTION], ONE.DEM_QTY, ONE.ACUM_ASSIGN_QTY, ONE.ASSIGNED_QTY, ONE.SUPPLY_TYPE, ONE.SUPPLY_SOURCE, ONE.SUPPLY_SOURCE_LINE, ONE.SUPPLY_QTY, ONE.REST_QTY, ONE.SUPPLIER, ONE.[PO STATUS], ONE.[WO STATUS], ONE.[SO CREATED DATE], ONE.[WO CREATED DATE], ONE.[SO PROMISE SHIP DATE PER LINE], ONE.[WO RELEASE DATE], ONE.[PO PLACE DATE], ONE.[SITE ARRIVAL], ONE.[UPDATE SHIP DATE], ONE.[INITIAL SHIP DATE], ONE.[LEAD TIME PROVIDE] AS 'LEAD TIME PROVIDE BY SCHEDULER', ONE.[LEAD TIME REQUIRED TO SUPPLIER], ONE.[LEAD TIME STANDARD], ONE.[QUALITY WAREHOUSE], ONE.COMMENTS, ONE.[SO LINK ERP], ONE.[SO LINE LINK ERP], ONE.[PARENT LINK SO ERP], ONE.[PARENT LINK SO LINE ERP], ONE.PLSO_ERP_CREATE_DATE, ONE.PLSO_ERP_SHIPPED_DATE
,CASE WHEN ONE.DEM_TYPE = 'WO' THEN (SELECT TOP 1 DEM_SOURCE FROM ENT_DEMAND_SUPPLY WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PARENT LINK SO AUT'
,CASE WHEN ONE.DEM_TYPE = 'WO' THEN (SELECT TOP 1 DEM_SOURCE_LINE FROM ENT_DEMAND_SUPPLY WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PARENT LINK SO LINE AUT'
,CASE WHEN ONE.DEM_TYPE = 'WO' THEN (SELECT TOP 1 [PLSO_ERP_CREATE_DATE] FROM ENT_DEMAND_SUPPLY WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PLSO AUT CREATED DATE'
,CASE WHEN ONE.DEM_TYPE = 'WO' THEN (SELECT TOP 1 [PLSO_ERP_SHIPPED_DATE] FROM ENT_DEMAND_SUPPLY WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = ONE.DEM_SOURCE AND SUPPLY_SOURCE_LINE = ONE.DEM_SOURCE_LINE ORDER BY DEM_PART_ID, DEM_DATE) ELSE NULL END AS 'PLSO AUT SHIPPED DATE'
FROM ENT_DEMAND_SUPPLY ONE
ORDER BY ONE.DEM_PART_ID, ONE.DEM_DATE
DROP INDEX ENT_DEMAND_SUPPLY.IDX_TMP
Таблица результатов часть 1 Результат таблицы часть 2
Как видите, в строке №.8 DEM_TYPE представляет собой 'WO' с DEM_SOURCE со значением 12900 и DEM_SOURCE_LINE со значением 1 (часть результатов таблицы 1), поэтому вв этом случае будет выполнен подзапрос 4 (результат таблицы 2)
* На рисунке №.2, столбцы PLSO AUT CREATED DATE и PLSO AUT DIPPED DATE имеют значение ПУСТО (NULL), это верно, поскольку эти записи могут существовать или нет
SubЛогика запросов
Логика этого материала такова: мне нужно найти DEM_SOURCE в SUPPLY_SOURCE и DEM_SOURCE_LINE в SUPPLY_SOURCE_LINE во всей таблице, я имею в виду, например, что мы возвращаемся к строке номер 8.
если мы возьмем строку нет.8 у нас есть эти значения ... DEM_TYPE = 'WO', DEM_SOURCE: 12900 и DEM_SOURCE_LINE = 1, я могу подготовить подзапрос для поиска и получить 4 дополнительных столбца для этой строки, например:
(SELECT TOP 1 DEM_SOURCE FROM ENT_DEMAND_SUPPLY WHERE SUPPLY_TYPE = 'WO' AND SUPPLY_SOURCE = '12900' AND SUPPLY_SOURCE_LINE = '1')
Результат подзапроса
и если вы проверите номер изображения.2, эти 4 значения будут в последних 4 столбцах с 4 именами, о которых мы говорили в начале ... Этим процессом я должен сделать это для каждой строки, когда DEM_TYPE - «WO», кто-то знает, как я могу улучшить это?Я пытался с индексом, это помогает, но не достаточно быстро.Большое спасибо за то, что нашли время прочитать этот пост, пожалуйста, если у вас есть вопросы или советы, пожалуйста, дайте мне знать!