具有两个条件的SQL Join同一列但数据名称不同

时间:2019-04-26 08:36:22

标签: sql-server

我需要使用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

输出应通过参考和UAP显示生产表上的库存

编辑

很抱歉,远程服务器是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 个答案:

答案 0 :(得分:2)

尝试使用链接子查询:

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