Oracle ORA:00904: LEFT JOIN 中的子查询

Oracle ORA:00904: Subquery in LEFT JOIN

我知道 Oracle 的 ANSI SQL 设置的子查询限制。您不能在声明的深度超过一层的子查询中使用标识符。

我正在尝试以下查询,据我所知,它只有一层深,但我收到了这个错误。这不适用于 table 加入吗? (我稍微缩短了过程,但问题应该很清楚。此外,如果它意味着什么,我在我的 select 值中使用 FIRST_VALUE 分析函数。我们在 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;

您正在尝试进行横向连接。您不能在 from 子句中使用外部 table 别名。通常,解决方法是使用聚合:

  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;