从Oracle中的左连接子查询中检索列

时间:2015-03-17 17:21:01

标签: sql oracle left-join

我向我的[Error] Execution (12: 25): ORA-00904: "N"."PORT_AID": invalid identifier子查询添加了左外连接EDW_SPLITTER_NT_PORT后收到错误spl。如何让我的查询工作?从N.PORT_AID子查询获取n并且它未在spl中到达它?我应该更改EDW_SPLITTER_NT_PORT子查询中的左连接spl,并将其加入到底部的n子查询中。

EDW_SPLITTER AND EDW_SPLITTER_NT_PORT彼此相关,这就是我将左连接添加到该表的原因。有什么建议吗?

Select spl.splitter_addr AS splitter_address,
          spl.splitter_port,
          spl_port_status
          from (
   SELECT splitter.splitter_addr AS splitter_address,
          splitter.splitter_port,
          CASE
             WHEN splitter.SPLITTER_PORT_STATUS = 'ACTIVE'
             THEN
                CASE
                   WHEN n.PORT_AID IS NULL THEN 'INACTIVE'
                   ELSE 'ACTIVE'
                END
             ELSE --follow through with whatever splitter_port_status other than active remains:
                DECODE (splitter.splitter_port_status,
                        'IN-ACTIVE', 'INACTIVE',
                        splitter.splitter_port_status)
          END
             AS splitter_port_status

     FROM ls2.edw_splitter@WBCMLS1P.sbc.com splitter 
                          left outer join EDW_SPLITTER_NT_PORT nt
    --  ON     splitter.splitter_addr = nt.splitter_addr
    ON     splitter.eid = nt.eid
                          AND splitter.rack = nt.rack
                          AND splitter.shelf = nt.shelf
                          AND splitter.card = nt.card
                          AND splitter.port = nt.port)  spl


          LEFT OUTER JOIN
          (SELECT a.eid,
                  a.location_id,
                  o.rack,
                  o.shelf,
                  TO_NUMBER (SUBSTR (card, -2, 2)) AS slot,
                  o.port,
                  o.ont,
                  o.port_aid,
                  o.ont_type
             FROM ls2.actl73x0@WBCMLS1P.sbc.com a
                  LEFT OUTER JOIN ls2.ACTL73XX_ONT@WBCMLS1P.sbc.com o
                     ON a.eid = o.eid
           UNION ALL
           SELECT b.eid,
                  b.location_id,
                  1 rack,
                  1 shelf,
                  bo.card AS slot,
                  bo.port,
                  bo.ont,
                  REPLACE (bo.ont_aid, 'ONT', 'ONT-1-1') AS port_aid,
                  bo.ont_type
             FROM ls2.blm@WBCMLS1P.sbc.com b
                  LEFT OUTER JOIN ls2.blm_ont@WBCMLS1P.sbc.com bo
                     ON b.eid = bo.eid) n
             ON     spl.eid = n.eid
                AND n.rack = spl.rack
                AND n.shelf = spl.shelf
                AND n.slot = spl.slot
                AND n.port = spl.port
                AND n.ont = spl.ont

2 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的问题,您说PORT_AID列来自n子查询。但是,您尝试在spl子查询中使用它,这超出了n子查询的范围。您必须在spl子查询中添加更多连接,以便在子查询中公开该列,或者您可以保留它并在外部查询中引用它。

此外,您在外部选择中使用的splitter别名无效。

答案 1 :(得分:0)

您的子查询spl

SELECT splitter.splitter_addr AS splitter_address,
    splitter.splitter_port,
    CASE 
        WHEN splitter.SPLITTER_PORT_STATUS = 'ACTIVE'
            THEN CASE 
                    WHEN n.PORT_AID IS NULL
                        THEN 'INACTIVE'
                    ELSE 'ACTIVE'
                    END
        ELSE --follow through with whatever splitter_port_status other than active remains:
            DECODE(splitter.splitter_port_status, 'IN-ACTIVE', 'INACTIVE', splitter.splitter_port_status)
        END AS splitter_port_status
FROM ls2.edw_splitter@WBCMLS1P.sbc.com splitter
LEFT JOIN EDW_SPLITTER_NT_PORT nt
    --  ON     splitter.splitter_addr = nt.splitter_addr
    ON splitter.eid = nt.eid
        AND splitter.rack = nt.rack
        AND splitter.shelf = nt.shelf
        AND splitter.card = nt.card
        AND splitter.port = nt.port

引用n.PORT_AID,但此子查询中没有派生表n。当你在这里说n.PORT_AID时,它不知道你在说什么。