简体   繁体   中英

SQL Join with 2 conditions same column but different data names

I need to join 2 tables using 2 columns as identifiers,

Reference and UAP

TABLE 1

Reference
UAP
Week 1
Week 2

Table 2
Reference
UAP
Stock

Here is the problem with data on both tables in UAP column

Table 1    Table 2
UAP1       M1
UAP2       M2
UAP3       M3
UAP4       M4
UAP5       M5
UAP6       M6
UAPP       PROTOS
EXT        EXTR
  • the UAPS are the same but name is just different
  • I have no control over the data i'm getting, it's a IBM DB2 remote server
  • I tried a local table to join but i want to avoid that 'cause of the performance impact (30+ seconds)

So far my query is this

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')

well of course the ideal would be

 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')

but it does not work cause different names... Is there a way to make this happen without a local join table that will slow my query by several seconds?

Here is the output of these queries individually

This is the production table

这是生产表

This is the stock table

库存表

the output should show me the Stock on the production table by Reference and UAP

EDIT

Sorry for confusion the remote server is IBM DB2. This was an error of my coworker that said it was coming from oracle--

Cheers for correct answer from @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')

another method which gives error in UAP1 not a column in table L that might work using dual table for 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')

Try to use a link-subquery:

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 -- !!!

Or you can create a link-table in the Oracle and then use it in your query. I think it'll be better because you can use it in other queries and insert there a new combinations.

Pseudo code:

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

One more variant with 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM