2015-04-29 3 views
0

Je connais les limitations de la sous-requête de la configuration ANSI SQL d'Oracle. Vous ne pouvez pas utiliser un identificateur dans une sous-requête déclarée plus d'un niveau profond.Oracle ORA: 00904: Sous-requête dans LEFT JOIN

J'essaie la requête suivante, qui, d'après ce que je peux voir est seulement un niveau profond, mais je reçois cette erreur. Cela ne fonctionne-t-il pas pour les jointures de table? (J'ai tronqué la procédure un peu, mais le problème devrait être clair.En outre, si cela signifie quelque chose, j'utilise FIRST_VALUE fonctions analytiques dans mes valeurs de sélection.Nous sommes sur 10g.)

L'erreur:

Error(111,79): PL/SQL: ORA-00904: "VT"."MAIL_TO_ADDRESS_NUMBER": invalid identifier 

Le proc:

PROCEDURE MYPROCEDURE (
    p_TransactionId IN NUMBER, 
    p_Cursor_Out OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN p_Cursor_Out FOR 
    SELECT 
    ... 
    FROM vehicle_transaction vt 
    INNER JOIN registration_transaction reg ON vt.transaction_id = reg.transaction_id 
    /* The problem is here */ 
    LEFT OUTER JOIN (
    SELECT 
     laddt2.address 
    FROM lien_address_transaction laddt2 
    WHERE vt.mail_to_address_number IS NOT NULL AND laddt2.address_number = vt.mail_to_address_number 
) laddt 
    ON (laddt2.address_number = vt.mail_to_address_number) 
    WHERE vt.transaction_id = p_TransactionId; 

END MYPROCEDURE; 

Répondre

1

Vous essayez de faire une jointure latérale. Vous ne pouvez pas utiliser un alias de table externe dans la clause from. En général, la solution consiste à utiliser l'agrégation:

SELECT 
    ... 
    FROM vehicle_transaction vt INNER JOIN 
     registration_transaction reg 
     ON vt.transaction_id = reg.transaction_id LEFT OUTER JOIN 
     (SELECT laddt2.address_number, MIN(laddt2.address) as address 
     FROM lien_address_transaction laddt2 
     WHERE vt.mail_to_address_number IS NOT NULL AND 
     GROUP BY laddt2.address_number 
     ) laddt 
     ON laddt.address_number = vt.mail_to_address_number 
    WHERE vt.transaction_id = p_TransactionId;