2015-04-29 2 views
0

Я знаю ограничения подзапросов в установке ANSI SQL Oracle. Вы не можете использовать идентификатор в подзапросе, объявленном более чем на один уровень.Oracle ORA: 00904: Подзапрос в LEFT JOIN

Я пытаюсь выполнить следующий запрос, который, насколько я могу видеть, только на одном уровне, но я получаю эту ошибку. Не работает ли это для объединения таблиц? (Я несколько усекла процедуру, но проблема должна быть ясной. Кроме того, если это что-то значит, я использую аналитические функции по моим выбранным значениям. Мы на 10g.)

Ошибка:

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

прок:

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; 

ответ

1

Вы пытаетесь сделать боковое соединение. Вы не можете использовать внешний псевдоним таблицы в предложении from. В общем, обход заключается в использовании агрегации:

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; 
Смежные вопросы