oracle - 如何在 Oracle 相关子查询连接中使用别名?

标签 oracle correlated-subquery

我正在使用子查询进行连接操作。当我对参数进行硬编码时,一切正常。但这些参数必须来自外部sql,我认为这被称为相关查询。我想使用表别名传递它们,但这会导致无效标识符

出于问题目的而发明的示例:

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)

通过(标准)连接到派生表,内部选择无法从外部选择访问别名或表。您收到的“无效标识符”是由 WHEREcountry_id = pr.country_id 行引起的。

鉴于您的 JOIN 条件,您可以安全地删除它而不改变结果。 Oracle 优化器足够聪明,可以将该条件推送到派生表中。

事实上,优化器会将查询重写为:

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);
<小时/>

但是,有一种方法可以从派生表中的外部查询访问表(或别名):它称为横向联接。

这是 SQL 标准的一部分,但您需要 Oracle 12 才能使用它:

以下内容合法的:

SELECT pr.province_name,co.country_name
FROM province pr
    JOIN <b><i>LATERAL</i></b> (
      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)

关于oracle - 如何在 Oracle 相关子查询连接中使用别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40023309/

相关文章:

MySQL 对每组的最后 X 行求和

sql - Oracle 12c 数据默认值

oracle - 不区分大小写和重音的 'like' 比较 oracle 而不改变 oracle 上的 session

sql - 如何在不访问源代码的情况下确定 Oracle 查询?

java - 403 禁止使用 Oracle 存储库中的 jdbc 驱动程序

sql - 相关子查询,oracle sql

MySQL:为什么子查询中的 where 子句对另一个子查询的结果不起作用?

mysql - PL/SQL 相当于 MYSQL COLLATE

php - 如何在单个查询中使用 While 循环编写多个查询?

mysql - 将 SELECT 中的相关子查询重写为 JOIN 语句