需要group_by PostgreSQL 8.4中的所有表字段而不是9.1中的表字段吗?

时间:2014-10-29 17:39:05

标签: postgresql sqlalchemy

我有这个查询在PostgreSQL 9.1中运行良好:

    tbl_grupos = dbs.query(Grupos).\
                      join(Cursos).\
                      join(AlumnosEnGrupos).\
                      join(Alumnos).\
                      outerjoin(join_clientes).\
                      filter(and_(cond_cliente,
                                  cond_curso,
                                  cond_grupo,
                                  cond_grupos,
                                  cond_profesor,
                                  Grupos.fecha_inicio <= self.fecha_fin,
                                  Grupos.fecha_fin >= self.fecha_inicio,
                                  Grupos.confirmado == True,
                                  )).\
                      order_by(Grupos.nombre, Grupos.id_).\
                      group_by(Grupos.nombre, Grupos.id_).\
                      having(func.count(AlumnosEnGrupos.id_) > 0)

当我在安装了PostgreSQL 8.4的远程服务器中运行它时会出现问题。它给我以下错误消息:

Error - <class 'sqlalchemy.exc.ProgrammingError'>: (ProgrammingError) column "grupos.resumen_horario" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...grupos_fecha_fin, grupos.codigo AS grupos_codigo, grupos.res...
                                                             ^
 'SELECT grupos.id AS grupos_id, grupos.nombre AS grupos_nombre, grupos.fecha_inicio AS grupos_fecha_inicio, grupos.fecha_fin AS grupos_fecha_fin, grupos.codigo AS grupos_codigo, grupos.resumen_horario AS grupos_resumen_horario, grupos.profesores_grupo AS grupos_profesores_grupo, grupos.aulas AS grupos_aulas, grupos.limite_de_entrega_naco AS grupos_limite_de_entrega_naco, grupos.objetivos AS grupos_objetivos, grupos.capacidad AS grupos_capacidad, grupos.cancelaciones_al_mes AS grupos_cancelaciones_al_mes, grupos.horas_de_clase AS grupos_horas_de_clase, grupos.direccion AS grupos_direccion, grupos.estacion AS grupos_estacion, grupos.recibe_avisos AS grupos_recibe_avisos, grupos.recibe_avisos_alumno AS grupos_recibe_avisos_alumno, grupos.cod_objeto AS grupos_cod_objeto, grupos.lugar AS grupos_lugar, grupos.confirmado AS grupos_confirmado, grupos.id_curso AS grupos_id_curso, grupos.id_departamento AS grupos_id_departamento, grupos.id_centro AS grupos_id_centro, grupos.id_aula AS grupos_id_aula, grupos.id_profesor AS grupos_id_profesor, grupos.id_nivel AS grupos_id_nivel \nFROM grupos JOIN cursos ON cursos.id = grupos.id_curso JOIN alumnos_en_grupos ON grupos.id = alumnos_en_grupos.id_grupo JOIN alumnos ON alumnos.id = alumnos_en_grupos.id_alumno LEFT OUTER JOIN clientes ON clientes.id = cursos.id_cliente \nWHERE cursos.id_cliente = %(id_cliente_1)s AND grupos.fecha_inicio <= %(fecha_inicio_1)s AND grupos.fecha_fin >= %(fecha_fin_1)s AND grupos.confirmado = true GROUP BY grupos.nombre, grupos.fecha_inicio, grupos.fecha_fin, grupos.codigo, grupos.id \nHAVING count(alumnos_en_grupos.id) > %(count_1)s ORDER BY grupos.nombre, grupos.fecha_inicio, grupos.fecha_fin, grupos.codigo, grupos.id' {'id_cliente_1': 241, 'fecha_inicio_1': datetime.date(2014, 10, 24), 'fecha_fin_1': datetime.date(2014, 10, 1), 'count_1': 0}

基本上说我需要group_bygrupos.resumen_horario。这就是我所做的,然后查询再次失败,说我必须将下一列添加到group_by子句。

我不断将表Grupos中的列添加到错误消息所指示的group_by子句中,直到我意识到它有点荒谬,特别是考虑到表Grupos已经存在20列。

我想了解发生了什么以及如何解决此问题并使查询在PostgreSQL 8.4中运行,而无需在表{{1}的所有30列中添加group_by子句}。

1 个答案:

答案 0 :(得分:2)

过去,Postgresql需要按所有非聚合列进行分组。从(我认为)版本9.1开始,现在可以按主键列进行分组(如果它们当然是查询的一部分)。有一篇可能有助于解释的here

更新:Depesz对此进行了大肆宣传here作为他的等待9.1&#34;系列帖子。