Oracle Equals-Plus运算符(加入t1.col1 = + t2.col2)

时间:2014-08-15 21:02:16

标签: sql join syntax oracle11g operators

我知道已经有很多类似的问题,但它们并不能满足我的需求。我知道(+)是WHERE子句中使用的仅Oracle连接运算符,并且方向指示LEFT或RIGHT。但是,我不完全确定我的情况是否匹配,因为语法与我迄今为止发现的所有内容都不同。我很困惑,因为= +在ON子句而不是WHERE子句中,它与我见过的例子不在同一个位置。这相当于(+)?这完全是另类吗?这是多余的吗?我不知道它在做什么。在我试图简化此查询时,我只是不确定如何处理此运算符。希望有人可以帮助我。

这是我继承的怪物的可怕演绎。这个摘录之后是UNION ALL和几乎完全相同的代码块,在几行上有一些细微差别。我现在正在解决问题,尝试简化所有事情,同时保持相同的结果。 (是的,它确实在运行!)如果我需要澄清,请告诉我。我使用了有意义内容的直接代码。

SELECT
  tons,
  of,
  insane,
  fields,
  from,
  way,
  too,
  many,
  different,
  tables
FROM
  seriously,
  these,
  tables,
  are,
  nuts,
  and,
  someone,
  decided,
  to
  LEFT JOIN ( --Two nested subqueries.
    SELECT
      R.SKN_NO
      ,R.REGION_NO
      ,R.REGION_PRICE_FLAG
      ,R.TICKET_RETAIL_DOL
      ,R.CLEARANCE
    FROM(
      SELECT
        P.SKN_NO
        ,P.REGION_NO
        ,P.TICKET_RETAIL_DOL
        ,RI2.REGION_PRICE_FLAG
        ,CASE P.PRICE_TYPE_CODE
          WHEN 'R' THEN 'Y'
          ELSE 'N'
        END CLEARANCE
        ,DENSE_RANK() OVER (PARTITION BY P.SKN_NO, P.REGION_NO
                            ORDER BY EFFECTIVE_DATE DESC) DR
      FROM
        RF_ITEM_PRICING P
        ,RF_ITEM RI2
        ,RF_SYS_PARMS RFID
        ,RF_MERCHANT_ORG MO2
        ,V_HB_STOCK_STATUS HSS2
        ,RF_STORE RS2
      WHERE
        RI2.SKN_NO = P.SKN_NO
        AND RFID.PARM_KEY = 'RFID'
        AND MO2.ORG_NO = 100
        AND MO2.DMM_NO = TO_NUMBER(RFID.MIN_VAL)
        AND RI2.DEPT_NO = MO2.DEPT_NO
        AND RI2.SKN_NO = HSS2.SKN_NO
        AND RS2.STORE_NO_4_DIGIT = HSS2.STORE_NO_4_DIGIT
        AND RI2.REGION_PRICE_FLAG = 'Y'
        AND P.REGION_NO = RS2.STORE_NO
        AND P.EFFECTIVE_DATE <= SYSDATE
      ) R
    WHERE R.DR=1
    ) RFPRICE
    --The two lines below are where the LEFT JOIN finally ends. Note the =+ here.
    ON HSS.SKN_NO =+ RFPRICE.SKN_NO
    AND RFPRICE.REGION_NO = HSS.STORE_NO
WHERE 
  --There are a ton of conditions here 
  --that link all those crazy tables together
  --with the exception of the LEFT JOIN one (alias RFPRICE)

3 个答案:

答案 0 :(得分:3)

据我所知,Oracle没有=+运算符(here是引用的示例)。但是,它确实有=和一元+。所以,我认为这将解析为:

HSS.SKN_NO = (+ RFPRICE.SKN_NO)

反过来,这将与:

相同
HSS.SKN_NO = RFPRICE.SKN_NO

一元+运算符似乎没有做任何事情。

答案 1 :(得分:-1)

如果&#34; +&#34;在该声明的另一边,我会说这是一个正确的外连接条件。但是从来没有见过它。如果将它移到语句的右侧,它是否仍然运行?如果是这样,它是HSS的右外连接。

我会找出该程序应该做什么,并使用CTE重写它,因为它看起来像是在进行基于SKN_NO的排名。

祝你好运!

答案 2 :(得分:-1)

我看到的大多数参考文献或者只说一元加号是身份,或者它被识别和忽略。&#34;我只找到一个参考(对于9i lite)表明它会改变符号正面。一元加上我的系统上没有做任何事情。 (9.2.0.6.0)