2010-01-20 42 views
0

Ceci est une tentative de correction d'un rapport Crystal sur l'utilisation de 2 sous-rapports!Sous-sélectionner une colonne Récapitulatif dans Oracle

J'ai une requête qui joint 3 tables, et je voulais utiliser une paire de sous-sélections qui apportent la même nouvelle table.

Voici la première des deux colonnes dans le script:

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" 

Lorsque ce livre l'ensemble de données la valeur de « firstHyp » ne change pas de valeur par pegstrip. Il renvoie un seul total pour la jointure et ne parvient pas à mettre la valeur correcte par pegstrip. Je pensais que la clause where aurait ramassé les jointures ligne par ligne.

Je ne fais pas souvent de syntaxe Oracle alors qu'est-ce qui me manque ici?

TIA

+0

veuillez formater le SQL avec des outils comme http://www.dpriver.com/pp/sqlformat.htm –

Répondre

1

Votre SQL est equivilent à ce qui suit:

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" 

Notez que la sous-requête qui génère firstHyp ne dépend aucunement des tables dans la requête externe ... Il est donc pas un Correllated ... ce qui signifie que sous-requête la valeur qu'il génère ne sera pas différent pour chaque ligne dans les résultats de la requête externe et, ce sera le même pour chaque ligne. Vous devez en quelque sorte mettre quelque chose dans la sous-requête qui le rend dépendant de la valeur de certaines lignes de la requête externe afin qu'elle devienne une sous-requête corrigée et s'exécute une fois pour chaque rangée externe ....

, vous mentionnez un la paire de sous-sélection, mais j'en vois seulement un. Où est l'autre?

+0

Merci Charles. Je pensais que cette sous-requête avait des hooks dans l'ensemble de données courant via ma clause where et non une condition de jointure. (choisir somme (htb.END_FNC_CUR_US_GAAP) de EQUITY_ACCOUNTS ea, HYPERION_TRIAL_BALANCE htb où (htb.PEGSTRIP = ea.PEGSTRIP et htb.PRD_NBR = 0 et htb.LOC_ID = ea.LOC_ID et htb.PRD_YY = ea .EOY)) firstHyp – SteveO

+0

Mais vous voyez maintenant qu'à l'exception de 'htb.PRD_NBR = 0' la sous-requête where est basée sur les valeurs des tables de sous-requête (aliases ea et htb) et non sur les valeurs des tables externes ... Pour en faire une sous-requête en corrélation, elle doit être dépendante de quelque chose provenant des tables ag ou du ea externe. btw, vous ne devez pas utiliser le même alias ('ea') pour les références de requête interne et externe à la table EQUITY_ACCOUNTS) –

0

Utilisation:

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 

Je suis d'accord avec l'évaluation de Charles Bretana que le SELECT original dans la clause SELECT n'a pas été corrélée, ce qui explique pourquoi la valeur n'a jamais changé par ligne. Mais le sous-SELECT a utilisé la table EQUITY_ACCOUNTS, qui est la base de la requête principale. J'ai donc supprimé la jointure et incorporé la table HYPERION_TRIAL_BALANCE dans la requête principale, en utilisant un LEFT JOIN. J'ai enveloppé la somme dans un NVL plutôt que COALESCE parce que je n'ai pas attrapé quelle version d'Oracle c'est pour.