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;
我知道 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;