我知道已经有很多类似的问题,但它们并不能满足我的需求。我知道(+)是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)
答案 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)