【问题标题】:How to use aliases in an Oracle correlated subquery join?如何在 Oracle 相关子查询连接中使用别名?
【发布时间】:2023-03-05 00:32:02
【问题描述】:

我正在使用子查询进行连接操作。当我对参数进行硬编码时,一切正常。但是这些参数必须来自外部 sql,我认为这被称为相关查询。我想使用表别名传递它们,但这会导致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)

这是输入的,所以我希望我没有在这里介绍任何语法问题。这个问题专门针对COUNTRY_ID=PR.COUNTRY_ID 跟在WHERE 子句之后。此类子查询中的别名是否合法?

【问题讨论】:

  • 好吧,只要我用WHERE COUNTRY_ID=123 替换WHERE COUNTRY_ID=PR.COUNTRY_ID,一切正常。是否与通过 Oracle SQL Developer 版本 3.2.09 运行此查询有关?

标签: oracle correlated-subquery


【解决方案1】:

您在两个不同的位置使用别名。一方面是合法的,另一方面是不合法的:

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)

通过(标准)连接到派生表,内部 选择无法从外部选择访问别名或表。您得到的“无效标识符”是由WHERE country_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);

然而,有一种方法可以从派生表中的外部查询访问表(或别名):它称为 lateral 连接。

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

以下合法的:

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

【讨论】:

  • 好的。那么这很简单。我正在使用不接受 LATERAL 的 11.2 版。另外,我为了这个问题发明了我的例子,不能按照你的建议重写我的查询。原因是我在该联接中获得了多行,而 suquery 将帮助我减少到我需要的单行。感谢您的及时回复。
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多