【问题标题】:Oracle group by Alias别名的 Oracle 组
【发布时间】:2021-03-04 23:30:46
【问题描述】:

Orale 使用别名列在组中返回错误。

SELECT  
    CONCAT( CONCAT( a.air_location, ' ,' ), a.air_code ) AS "Departs From",
    CONCAT( CONCAT( ad.air_location, ' ,' ), ad.air_code ) AS "Arrives At",
    MIN(f.fl_fare) AS "Minimun Fare" 
FROM flight f
INNER JOIN airport a ON a.air_code = f.fl_dest
INNER JOIN airport ad ON ad.air_code = f.fl_orig
GROUP BY "Departs From", "Arrives At";

它正在返回:

ORA-00904: "Arrives At": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 10 Column: 26

【问题讨论】:

    标签: sql oracle aggregate-functions min


    【解决方案1】:

    将您的 CONCAT 查询包装在 派生表中GROUP BY 其结果:

    SELECT "Departs From", "Arrives At", MIN(fl_fare) as minimun_fare
    FROM
    (
        SELECT  
            CONCAT( CONCAT( a.air_location, ' ,' ), a.air_code ) AS "Departs From",
            CONCAT( CONCAT( ad.air_location, ' ,' ), ad.air_code ) AS "Arrives At",
            f.fl_fare
        FROM flight f
        INNER JOIN airport a ON a.air_code = f.fl_dest
        INNER JOIN airport ad ON ad.air_code = f.fl_orig
    ) dt
    GROUP BY "Departs From", "Arrives At";
    

    (GROUP BY 在 SELECT 列表之前进行评估。因此列别名不能在 GROUP BY 中使用,因为它们尚不存在。)

    【讨论】:

      【解决方案2】:

      您不能在 Oracle 的 GROUP BY 子句中使用列别名 - 也不支持位置参数。您需要重复表达式,或使用子查询或 cte。所以:

      select  
          ao.air_location || ' ,' || ao.air_code as departs_from,
          ad.air_location || ' ,' || ad.air_code as arrives_at,
          min(f.fl_fare) as minimun_fare
      from flight f
      inner join airport ad on ad.air_code = f.fl_dest
      inner join airport ao on ao.air_code = f.fl_orig
      group by 
          ao.air_location || ' ,' || ao.air_code
          ad.air_location || ' ,' || ad.air_code
      

      您的查询的其他更改:

      • 将表别名更改为对我来说更有意义的名称(我认为您在结果中颠倒了起点和终点)

      • 使用标准 ANSI 字符串连接运算符 || 而不是 Oracle 支持的 CONCAT()

      • 使用不需要引用的列别名(没有嵌入空格),因为它使查询更易于编写 - 如果您真的需要,您可以恢复该更改。

      作为最后的想法:这是使用横向连接生成别名的替代方法:

      select x.departs_from, x.arrives_at, min(f.fl_fare) as minimun_fare
      from flight f
      inner join airport ad on ad.air_code = f.fl_dest
      inner join airport ao on ao.air_code = f.fl_orig
      cross apply (
          select 
              ao.air_location || ' ,' || ao.air_code as departs_from,
              ad.air_location || ' ,' || ad.air_code as arrives_at
          from dual
      ) x
      group by x.departs_from, x.arrives_at
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多