Каков наилучший способ присоединиться к столам - PullRequest
1 голос
/ 08 января 2020

это больше похоже на общий вопрос. Я ищу лучший способ присоединиться к 4, может быть, 5 разных столов. Я пытаюсь создать Power Bi, извлекающую оперативную информацию из IBM AS400, где служба поддержки клиентов может ввести один из наших номеров деталей, посмотреть, сколько деталей у нас в запасе, если нет, увидеть время выполнения заказа и уже есть заказы. введен для введенного номера детали.

SERI - это наша инвентарная таблица с 37180 записями. (активный инвентарь, который доступен)

METHDM - это наша таблица комплектов с 37459 записями. (эта таблица содержит перечень материалов для нестандартных комплектов, KIT A123 содержит различные номера деталей, в том числе и в SERI.)

STKA - наша таблица сроков поставки деталей с 76796 записями. (время выполнения заказа означает, сколько времени потребуется для поступления деталей)

OCRI - это наша таблица заказов на продажу с 6497 записями. (Эта таблица содержит все заказы клиентов)

У меня есть некоторые знания в написании запросов, но этот более сложный из того, что я создал в прошлом. Должен ли я начинать с таблицы, в которой больше всего записей, и начинать слева, присоединяясь к остальным?

Из STKA 76796 записей

Левое соединение METHDM 37459 записей в STKA Левое соединение SERI 37180 записей в STKA
оставлено соединение записей OCRI 6497 в STAK

Select

STKA.v6part as part,
STKA.v6plnt as plant,
STKA.v6tdys as pur_leadtime,
STKA.v6prpt as Pur_PrepLeadtime,
STKA.v6lead as Mfg_leadtime,
STKA.v6prpt as Mfg_PrepLeadTime,
METHDM.AQMTLP AS COMPONENT,
METHDM.AQQPPC AS QTYNEEDED,
SERI.HTLOTN AS BATCH,
SERI.HTUNIT AS UOM,
(HTQTY - HTQTYC) as ONHAND,
OCRI.DDORD# AS SALESORDER,
OCRI.DDRDAT AS PROMISED

from stka

left join METHDM on STKA.V6PART = METHDM.AQPART
left join SERI on STKA.V6PART = SERI.HTPART
left join OCRI on STKA.V6PART = OCRI.DDPART

Это лучший способ присоединиться к таблицам?

Ответы [ 2 ]

2 голосов
/ 08 января 2020

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

CREATE TABLE #STKA (V6PART INT, OTHER_DATA VARCHAR(50));
CREATE TABLE #METHDM (AQPART INT, KIT_ID INT, SOME_DATE DATETIME, OTHER_DATA VARCHAR(50));
CREATE TABLE #SERI (HTPART INT, OTHER_DATA VARCHAR(50));
CREATE TABLE #OCRI (DDPART INT, OTHER_DATA VARCHAR(50));
INSERT INTO #STKA SELECT 1, NULL UNION ALL SELECT 2, NULL UNION ALL SELECT 3, NULL; --1, 2, 3 Ids
INSERT INTO #METHDM SELECT 1, 1, '20200108 10:00', NULL UNION ALL SELECT 1, 2, '20200108 11:00', NULL UNION ALL SELECT 2, 1, '20200108 13:00', NULL; --1 Id appears twice, 2 Id once, no 3 Id
INSERT INTO #SERI SELECT 1, NULL UNION ALL SELECT 3, NULL; --1 and 3 Ids
INSERT INTO #OCRI SELECT 1, NULL UNION ALL SELECT 4, NULL; --1 and 4 Ids

Итак, по сути, у нас есть несколько проблем:

o первая проблема заключается в том, что идентификаторы в таблицах различаются, одна таблица имеет идентификатор # 4, но ее нет ни в одной из другие; o вторая проблема состоит в том, что у нас есть несколько строк для одного и того же идентификатора в одной таблице; o третья проблема заключается в том, что в некоторых таблицах «отсутствуют» идентификаторы, которые есть в других таблицах, которые вы уже рассмотрели с помощью LEFT JOIN, поэтому я проигнорирую это.

--This will select ID 1 twice, 2 once, 3 once, and miss 4 completely
SELECT
    *
FROM
    #STKA
    LEFT JOIN #METHDM ON #METHDM.AQPART = #STKA.V6PART
    LEFT JOIN #SERI ON #SERI.HTPART = #STKA.V6PART
    LEFT JOIN #OCRI ON #OCRI.DDPART = #STKA.V6PART;

Итак, проблема в том, что мы не все идентификаторы в нашей «якорной» таблице STKA, и на самом деле нет ни одной таблицы, в которой есть все идентификаторы. Теперь ваши данные могут быть в порядке, но если это не так, вы можете просто добавить шаг, чтобы найти каждый идентификатор, и использовать его в качестве привязки.

--This will select each ID, but still doubles up on ID 1
WITH Ids AS (
    SELECT V6PART AS ID FROM #STKA
    UNION
    SELECT AQPART AS ID FROM #METHDM
    UNION
    SELECT HTPART AS ID FROM #SERI
    UNION
    SELECT DDPART AS ID FROM #OCRI)
SELECT
    *
FROM
    Ids I
    LEFT JOIN #STKA ON #STKA.V6PART = I.Id
    LEFT JOIN #METHDM ON #METHDM.AQPART = I.Id
    LEFT JOIN #SERI ON #SERI.HTPART = I.Id
    LEFT JOIN #OCRI ON #OCRI.DDPART = I.Id;

Это использует выражение общей таблицы, но подзапрос также сделает работу. Однако это все еще оставляет нас с проблемой, когда идентификатор 1 появляется дважды в списке, потому что он имеет несколько строк в одной из вложенных таблиц.

Один из способов исправить это - выбрать строку с самой последней дата или любой другой ЗАКАЗ, который вы можете применить к данным:

--Pick the best row for the table where it has multiple rows, now we get one row per ID
WITH Ids AS (
    SELECT V6PART AS ID FROM #STKA
    UNION
    SELECT AQPART AS ID FROM #METHDM
    UNION
    SELECT HTPART AS ID FROM #SERI
    UNION
    SELECT DDPART AS ID FROM #OCRI),
BestMETHDM AS (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY AQPART ORDER BY SOME_DATE DESC) AS ORDER_ID
    FROM
        #METHDM)
SELECT
    *
FROM
    Ids I
    LEFT JOIN #STKA ON #STKA.V6PART = I.Id
    LEFT JOIN BestMETHDM ON BestMETHDM.AQPART = I.Id AND BestMETHDM.ORDER_ID = 1
    LEFT JOIN #SERI ON #SERI.HTPART = I.Id
    LEFT JOIN #OCRI ON #OCRI.DDPART = I.Id;

Конечно, вы также можете добавить некоторую агрегацию (SUM, MAX, MIN, AVG и др. c.) для решения этой проблемы ( если это действительно проблема). Кроме того, я использовал выражение для общей таблицы, но это также сработало бы с подзапросом.

0 голосов
/ 08 января 2020

Расширяя комментарий, сделанный по этому вопросу ..

Я бы сказал, что начну с SERI, так как эта таблица содержит весь инвентарь для нашего объекта и должна охватывать другие таблицы

Однако, как сказал вопрос

SERI - это наша таблица инвентаря с 37180 записями. (активный инвентарь, который доступен)

По моему опыту, активный инвентарь не совпадает со всеми частями.

Обычно в таком запросе я ожидал бы, что первой таблицей будет какая-то таблица Parts Master , которая содержит каждый возможный идентификатор детали.

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