在Oracle中选择一个总结栏
这是一个尝试修复一个水晶报告使用2个子报告!在Oracle中选择一个总结栏
我有一个连接3个表的查询,我想用一对子选择引入相同的新表。
这里是在脚本中的第一个两列:
SELECT ea."LOC_ID", lo."DESCR", ea."PEGSTRIP", ea."ENTITY_OWNER"
, ea."PCT_OWNERSHIP", ea."BEG_BAL", ea."ADDITIONS", ea."DISPOSITIONS"
, ea."EXPLANATION", ea."END_BAL", ea."NUM_SHARES", ea."PAR_VALUE"
, ag."DESCR", ea."EOY", ea."FAKEPEGSTRIP",
(select sum(htb.END_FNC_CUR_US_GAAP)
from EQUITY_ACCOUNTS ea , HYPERION_TRIAL_BALANCE htb
where
htb.PEGSTRIP = ea.PEGSTRIP and
htb.PRD_NBR = 0 and
htb.LOC_ID = ea.LOC_ID and
htb.PRD_YY = ea.EOY
) firstHyp
FROM ("TAXPALL"."ACCOUNT_GROUPING" ag
INNER JOIN "TAXP"."EQUITY_ACCOUNTS" ea
ON (ag."ACCT_ID"=ea."PEGSTRIP") AND (ag."EOY"=ea."EOY"))
INNER JOIN "TAXP"."LOCATION" lo ON ea."LOC_ID"=lo."LOC_ID"
WHERE ea."EOY"=2009
ORDER BY ea."LOC_ID", ea."PEGSTRIP"
当此提供的数据集“firstHyp”的价值无法通过pegstrip值改变。它返回一个单独的总数,并且未能通过pegstrip将值设置为正确。 我认为where子句会逐行拾取连接。
我不会经常使用Oracle语法,所以我在这里错过了什么?
TIA
你的SQL被equivilent以下几点:
SELECT ea."LOC_ID", lo."DESCR", ea."PEGSTRIP",
ea."ENTITY_OWNER" , ea."PCT_OWNERSHIP",
ea."BEG_BAL", ea."ADDITIONS", ea."DISPOSITIONS" ,
ea."EXPLANATION", ea."END_BAL", ea."NUM_SHARES",
ea."PAR_VALUE" , ag."DESCR", ea."EOY", ea."FAKEPEGSTRIP",
(select sum(htb.END_FNC_CUR_US_GAAP)
from EQUITY_ACCOUNTS iea
Join HYPERION_TRIAL_BALANCE htb
On htb.PEGSTRIP = iea.PEGSTRIP
and htb.LOC_ID = iea.LOC_ID
and htb.PRD_YY = iea.EOY
where htb.PRD_NBR = 0) firstHyp
FROM "TAXPALL"."ACCOUNT_GROUPING" ag
JOIN "TAXP"."EQUITY_ACCOUNTS" ea
ON ag."ACCT_ID"=ea."PEGSTRIP"
AND ag."EOY"=ea."EOY"
JOIN "TAXP"."LOCATION" lo
ON ea."LOC_ID"=lo."LOC_ID"
WHERE ea."EOY"=2009
ORDER BY ea."LOC_ID", ea."PEGSTRIP"
注意,产生firstHyp子查询是不以任何方式依赖于外部查询的表...因此有不一个Correllated子查询...这意味着它生成的值不会在外部查询结果的每一行不同对于每一行,它将是相同的。您需要以某种方式在子查询中添加某些内容,使其依赖于外部查询中某些行的值,以便它将成为相关的子查询并针对每个外部行反复运行一次...
此外,你提到一个对的子选择,但我只看到一个。另一个在哪里?
这样的工具格式化sql谢谢Charles。我认为这个子查询通过我的where子句而不是连接条件挂钩到当前数据集中。 (SELECT SUM(htb.END_FNC_CUR_US_GAAP) 从EQUITY_ACCOUNTS EA,HYPERION_TRIAL_BALANCE HTB 其中(htb.PEGSTRIP = ea.PEGSTRIP 和htb.PRD_NBR = 0 和htb.LOC_ID = ea.LOC_ID 和htb.PRD_YY = EA .EOY))firstHyp – SteveO 2010-01-20 01:47:39
但您现在看到,除了'htb.PRD_NBR = 0',子查询where子句基于子查询表(别名ea和htb)中的值,而不是外部表中的任何值。要使它成为一个ccorrelatted子查询,它需要依赖于表ag或外部ea中的某些内容。顺便说一句,你不应该对EQUITY_ACCOUNTS表的内部和外部查询引用使用相同的别名('ea')) – 2010-01-20 02:06:03
用途:
SELECT ea.LOC_ID,
lo.DESCR,
ea.PEGSTRIP,
ea.ENTITY_OWNER,
ea.PCT_OWNERSHIP,
ea.BEG_BAL,
ea.ADDITIONS,
ea.DISPOSITIONS,
ea.EXPLANATION,
ea.END_BAL,
ea.NUM_SHARES,
ea.PAR_VALUE,
ag.DESCR,
ea.EOY,
ea.FAKEPEGSTRIP,
NVL(SUM(htb.END_FNC_CUR_US_GAAP), 0) AS firstHyp
FROM TAXPALL.ACCOUNT_GROUPING ag
JOIN TAXP.EQUITY_ACCOUNTS ea ON ea.PEGSTRIP = ag.ACCT_ID
AND ea.EOY = ag.EOY
AND ea.EOY = 2009
JOIN TAXP.LOCATION lo ON lo.LOC_ID = ea.LOC_ID
LEFT JOIN HYPERION_TRIAL_BALANCE htb ON htb.PEGSTRIP = ea.PEGSTRIP
AND htb.LOC_ID = ea.LOC_ID
AND htb.PRD_YY = ea.EOY
AND htb.PRD_NBR = 0
GROUP BY ea.LOC_ID,
lo.DESCR,
ea.PEGSTRIP,
ea.ENTITY_OWNER,
ea.PCT_OWNERSHIP,
ea.BEG_BAL,
ea.ADDITIONS,
ea.DISPOSITIONS,
ea.EXPLANATION,
ea.END_BAL,
ea.NUM_SHARES,
ea.PAR_VALUE,
ag.DESCR,
ea.EOY,
ea.FAKEPEGSTRIP,
ORDER BY ea.LOC_ID, ea.PEGSTRIP
我与查尔斯BRETANA的评估,即原来的SELECT SELECT子句中没有相关性,这就是为什么值每行从来没有改变过同意。但子SELECT使用EQUITY_ACCOUNTS
表,这是主要查询的基础。所以我删除了连接,并使用LEFT JOIN
将HYPERION_TRIAL_BALANCE
表合并到主查询中。我将SUM包装在NVL
而不是COALESCE
中,因为我没有看到Oracle的这个版本。
请使用像http://www.dpriver.com/pp/sqlformat.htm – 2010-01-20 00:43:41