如何在 Oracle 相关子查询连接中使用别名?
How to use aliases in an Oracle correlated subquery join?
我正在使用子查询进行连接操作。当我硬编码参数时,一切正常。但是这些参数必须来自外部 sql 我认为这被称为相关查询。我想使用 table 别名传递它们,但这会导致 invalid identifier
.
示例发明 用于问题的目的:
SELECT
PR.PROVINCE_NAME
,CO.COUNTRY_NAME
FROM
PROVINCE PR
JOIN (
SELECT COUNTRY_ID, COUNTRY_NAME
FROM COUNTRY
WHERE COUNTRY_ID=PR.COUNTRY_ID
) CO ON CO.COUNTRY_ID=PR.COUNTRY_ID
WHERE
PR.PROVINCE_ID IN (1,2)
这是输入的,所以我希望我没有在这里引入任何语法问题。问题具体是关于 WHERE
子句之后的 COUNTRY_ID=PR.COUNTRY_ID
。此类子查询中的别名是否合法?
您在两个不同的位置使用别名。一个是合法的,另一个是不合法的:
SELECT pr.province_name, co.country_name
FROM province pr
JOIN (
SELECT country_id, country_name
FROM country
WHERE country_id = pr.country_id --<< this reference to the outer table/alias is invalid
) co ON co.country_id = pr.country_id -- this is valid
WHERE pr.province_id IN (1,2)
通过(标准)连接到派生的 table,inner select 无法从中访问别名或 table外select。您得到的 "invalid identifier" 是由行 WHERE country_id = pr.country_id
引起的。
鉴于您的 JOIN 条件,您可以安全地删除它而不更改结果。并且 Oracle 优化器足够聪明,可以将该条件推入派生的 table。
实际上优化器会将查询重写为:
SELECT pr.province_name, co.country_name
FROM province pr
JOIN country co ON co.country_id = pr.country_id
WHERE pr.province_id IN (1,2);
然而,有一种方法可以从派生的 table 中的外部查询访问 table(或别名):它称为 lateral 连接。
这是 SQL 标准的一部分,但您需要 Oracle 12 才能使用它:
以下是合法的:
SELECT pr.province_name,co.country_name
FROM province pr
JOIN <b><i>LATERAL</b></i> (
SELECT country_id, country_name
FROM country
WHERE country_id = pr.country_id
) co ON co.country_id = pr.country_id
WHERE pr.province_id IN (1,2)
我正在使用子查询进行连接操作。当我硬编码参数时,一切正常。但是这些参数必须来自外部 sql 我认为这被称为相关查询。我想使用 table 别名传递它们,但这会导致 invalid identifier
.
示例发明 用于问题的目的:
SELECT
PR.PROVINCE_NAME
,CO.COUNTRY_NAME
FROM
PROVINCE PR
JOIN (
SELECT COUNTRY_ID, COUNTRY_NAME
FROM COUNTRY
WHERE COUNTRY_ID=PR.COUNTRY_ID
) CO ON CO.COUNTRY_ID=PR.COUNTRY_ID
WHERE
PR.PROVINCE_ID IN (1,2)
这是输入的,所以我希望我没有在这里引入任何语法问题。问题具体是关于 WHERE
子句之后的 COUNTRY_ID=PR.COUNTRY_ID
。此类子查询中的别名是否合法?
您在两个不同的位置使用别名。一个是合法的,另一个是不合法的:
SELECT pr.province_name, co.country_name
FROM province pr
JOIN (
SELECT country_id, country_name
FROM country
WHERE country_id = pr.country_id --<< this reference to the outer table/alias is invalid
) co ON co.country_id = pr.country_id -- this is valid
WHERE pr.province_id IN (1,2)
通过(标准)连接到派生的 table,inner select 无法从中访问别名或 table外select。您得到的 "invalid identifier" 是由行 WHERE country_id = pr.country_id
引起的。
鉴于您的 JOIN 条件,您可以安全地删除它而不更改结果。并且 Oracle 优化器足够聪明,可以将该条件推入派生的 table。
实际上优化器会将查询重写为:
SELECT pr.province_name, co.country_name
FROM province pr
JOIN country co ON co.country_id = pr.country_id
WHERE pr.province_id IN (1,2);
然而,有一种方法可以从派生的 table 中的外部查询访问 table(或别名):它称为 lateral 连接。
这是 SQL 标准的一部分,但您需要 Oracle 12 才能使用它:
以下是合法的:
SELECT pr.province_name,co.country_name
FROM province pr
JOIN <b><i>LATERAL</b></i> (
SELECT country_id, country_name
FROM country
WHERE country_id = pr.country_id
) co ON co.country_id = pr.country_id
WHERE pr.province_id IN (1,2)