SQL Join с двумя условиями в одном столбце, но с разными именами данных - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно объединить 2 таблицы, используя 2 столбца в качестве идентификаторов,

Ссылка и UAP

TABLE 1

Reference
UAP
Week 1
Week 2

Table 2
Reference
UAP
Stock

Вот проблема с данными обеих таблиц в столбце UAP

Table 1    Table 2
UAP1       M1
UAP2       M2
UAP3       M3
UAP4       M4
UAP5       M5
UAP6       M6
UAPP       PROTOS
EXT        EXTR
  • UAPS такие же, но имя просто другое
  • У меня нет контроля над данными, которые я получаю, это удаленный сервер IBM DB2
  • Я попыталсяЛокальная таблица, чтобы присоединиться, но я хочу избежать этого из-за влияния на производительность (30+ секунд)

Пока мой запрос это

SELECT 
    *
FROM OPENQUERY(MACPAC, 
    'SELECT 
        P.Referencia, 
        P.UAP, 
        P.W01, 
        P.W02,
        S.Stock
    FROM AUTO.D805DATPOR.Production AS P
    INNER JOIN AUTO.D805DATPOR.Stock S
    ON S.Reference = S.Reference
    WHERE (P.Reference Not Like ''FS%'')
    ORDER BY Reference')

ну, конечно, идеальнобыло бы

 SELECT 
        *
    FROM OPENQUERY(MACPAC, 
        'SELECT 
            P.Referencia, 
            P.UAP, 
            P.W01, 
            P.W02,
            S.Stock
        FROM AUTO.D805DATPOR.Production AS P
        INNER JOIN AUTO.D805DATPOR.Stock S
        ON P.Reference = S.Reference AND P.UAP = S.UAP
        WHERE (P.Reference Not Like ''FS%'')
        ORDER BY Reference')

, но это не работает, потому что другие имена ... Есть ли способ сделать это без локальной таблицы соединения, которая замедлит мой запрос на несколько секунд?

Вот результат этих запросов в отдельности

Это производственная таблица

This is Production table

Это биржевая таблица

Stock Table

на выходе должен быть указан запас на производственной таблице по ссылкеd UAP

EDIT

Извините за путаницу, удаленный сервер - IBM DB2.Это была ошибка моего коллеги, которая сказала, что это исходит от оракула -

Приветствия за правильный ответ от @Sergey Menshov.

SELECT
    Reference,  
    UAP, 
    W01, 
    W02
FROM OPENQUERY(MACPAC, 
    'SELECT 
        P.Reference, 
        P.UAP, 
        P.W01, 
        P.W02
    FROM AUTO.D805DATPOR.Production AS P
    LEFT JOIN AUTO.D805DATPOR.Stock S
    ON P.Reference = S.Reference AND
         S.UAP =
             CASE P.UAP
                  WHEN ''UAP1'' THEN ''M1''
                  WHEN ''UAP2'' THEN ''M2''
                  WHEN ''UAP3'' THEN ''M3''
                  WHEN ''UAP4'' THEN ''M4''
                  WHEN ''UAP5'' THEN ''M5''
                  WHEN ''UAP6'' THEN ''M6''
                  WHEN ''UAPP'' THEN ''PROTOS''
                  WHEN ''EXT'' THEN ''EXTR''
                END
        WHERE (P.Reference Not Like ''FS%'')
    ORDER BY Reference DESC')

другой метод, который дает ошибку в UAP1, а не в столбцев таблице L, которая может работать с использованием двойной таблицы для DB2

    SELECT
    Reference,  
    UAP, 
    W01, 
    W02
FROM OPENQUERY(MACPAC, 
    'SELECT 
        P.Reference, 
        P.UAP, 
        P.W01, 
        P.W02
    FROM AUTO.D805DATPOR.Production AS P
    JOIN 
        (
            SELECT ''UAP1'' AS UAP1, ''M1'' AS UAP2 FROM sysibm.sysdummy1 
            UNION ALL SELECT ''UAP2'',''M2'' FROM sysibm.sysdummy1 
            UNION ALL SELECT ''UAP3'',''M3'' FROM sysibm.sysdummy1 
            UNION ALL SELECT ''UAP4'',''M4'' FROM sysibm.sysdummy1 
            UNION ALL SELECT ''UAP5'',''M5'' FROM sysibm.sysdummy1 
            UNION ALL SELECT ''UAP6'',''M6'' FROM sysibm.sysdummy1 
            UNION ALL SELECT ''UAPP'',''PROTOS'' FROM sysibm.sysdummy1 
            UNION ALL SELECT ''EXT'',''EXTR'' FROM sysibm.sysdummy1 
        ) L
        ON P.UAP = L.UAP1
        INNER JOIN AUTO.D805DATPOR.Stock S
        ON P.Reference = S.Reference AND S.UAP = L.UAP2
        WHERE (P.Reference Not Like ''FS%'')
    ORDER BY Reference DESC')

1 Ответ

2 голосов
/ 26 апреля 2019

Попробуйте использовать ссылочный подзапрос:

FROM AUTO.D805DATPOR.Production AS P
JOIN
  (
    SELECT ''UAP1'' AS UAP1,''M1'' AS UAP2 FROM DUAL
    UNION ALL SELECT ''UAP2'',''M2'' FROM DUAL
    UNION ALL SELECT ''UAP3'',''M3'' FROM DUAL
    UNION ALL SELECT ''UAP4'',''M4'' FROM DUAL
    UNION ALL SELECT ''UAP5'',''M5'' FROM DUAL
    UNION ALL SELECT ''UAP6'',''M6'' FROM DUAL
    UNION ALL SELECT ''UAPP'',''PROTOS'' FROM DUAL
    UNION ALL SELECT ''EXT'',''EXTR'' FROM DUAL
  ) L
ON P.UAP=L.UAP1 -- !!!
INNER JOIN AUTO.D805DATPOR.Stock S
ON P.Reference = S.Reference AND S.UAP=L.UAP2 -- !!!

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

Псевдокод:

CREATE TABLE UAP_LINK(
  UAP1 VARCHAR2(20) NOT NULL,
  UAP2 VARCHAR2(20) NOT NULL,
PRIMARY KEY(UAP1),
UNIQUE(UAP2)
)

INSERT UAP_LINK VALUES
UAP1, M1
UAP2, M2
UAP3, M3
UAP4, M4
UAP5, M5
UAP6, M6
UAPP, PROTOS
EXT , EXTR

Еще один вариант с CASE:

FROM AUTO.D805DATPOR.Production AS P
INNER JOIN AUTO.D805DATPOR.Stock S
ON P.Reference = S.Reference
  AND S.UAP=
        CASE P.UAP
          WHEN ''UAP1'' THEN ''M1''
          WHEN ''UAP2'' THEN ''M2''
          WHEN ''UAP3'' THEN ''M3''
          WHEN ''UAP4'' THEN ''M4''
          WHEN ''UAP5'' THEN ''M5''
          WHEN ''UAP6'' THEN ''M6''
          WHEN ''UAPP'' THEN ''PROTOS''
          WHEN ''EXT'' THEN ''EXTR''
        END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...