子查询列名歧义及GROUP BY表达式错误问题求解
解决SQL子查询的列歧义与GROUP BY问题
针对你的问题,有两种可行的调整方式,既能保留NOMBREUNIDAD作为输出列名,又能解决两个报错:
方式一:将指定表的列加入GROUP BY子句
你使用的是Oracle数据库,其语法要求SELECT列表中的非聚合列必须全部出现在GROUP BY子句中。修改后的子查询如下:
( SELECT ID_PLAN, ID_CURSO, NEDICION, UNIDADES.NOMBRE AS NOMBREUNIDAD FROM ASISTEN, ALUMNOS, UNIDADES WHERE ASISTEN.COD = ALUMNOS.COD AND UNIDADES.IDESTRUCTURA = ALUMNOS.IDESTRUCTURA AND UNIDADES.CDUNDORG = ALUMNOS.CDUNDORG AND UPPER(TRANSLATE(UNIDADES.NOMBRE, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE '%CONSEJERIA%' GROUP BY ID_PLAN, ID_CURSO, NEDICION, UNIDADES.NOMBRE ) ASIS
这段代码既明确了NOMBRE列来自UNIDADES表,解决了列歧义问题,同时遵守了Oracle的GROUP BY规则,不会再触发"not a GROUP BY expression"错误。
方式二:用聚合函数包裹指定列(无需修改GROUP BY)
如果每组ID_PLAN, ID_CURSO, NEDICION对应的UNIDADES.NOMBRE是唯一值,可以用聚合函数(如MAX()或MIN())包裹该列,无需调整GROUP BY子句:
( SELECT ID_PLAN, ID_CURSO, NEDICION, MAX(UNIDADES.NOMBRE) AS NOMBREUNIDAD FROM ASISTEN, ALUMNOS, UNIDADES WHERE ASISTEN.COD = ALUMNOS.COD AND UNIDADES.IDESTRUCTURA = ALUMNOS.IDESTRUCTURA AND UNIDADES.CDUNDORG = ALUMNOS.CDUNDORG AND UPPER(TRANSLATE(UNIDADES.NOMBRE, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE '%CONSEJERIA%' GROUP BY ID_PLAN, ID_CURSO, NEDICION ) ASIS
这种方式适合确定分组内该列无重复值的场景,聚合后不会改变实际结果,同时满足语法要求。
内容的提问来源于stack exchange,提问作者user2638180
相关产品推荐
相关产品推荐

