Cláusula Group by en mySQL y postgreSQL, ¿por qué el error en postgreSQL?

Resuelto user1735921 asked hace 9 años • 3 respuestas

Supongamos que tengo esta tabla: nombrado = the_table cuya estructura es:

postgreSQL:

 create table the_table (col3 SERIAL, col2 varchar, col1 varchar, PRIMARY KEY(col3));

MySQL:

create table the_table ( col3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, col2 varchar(20), col1 varchar(20) )

Luego inserté la tabla:

INSERT INTO the_table (col2,col1) VALUES 
('x','a'),
('x','b'),
('y','c'),
('y','d'),
('z','e'),
('z','f');

Ahora la tabla se ve así:

col3 | col2 | col1 
------+------+------
    1 | x    | a
    2 | x    | b
    3 | y    | c
    4 | y    | d
    5 | z    | e
    6 | z    | f

Cuando hago esta consulta:

select * from the_table group by col2

luego en mysql obtengo:

1 x a
3 y c
5 z e

y en postgreSQL, aparece el error:

ERROR:  column "the_table.col3" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select * from the_table group by col2;

Mis preguntas:

¿Qué significa este error? ¿Qué es la función agregada?

Cuando funciona en MySQL, ¿por qué no puede funcionar en postgreSQL?

user1735921 avatar Nov 10 '15 18:11 user1735921
Aceptado

Necesitas usar la FUNCIÓN AGREGADA :

Las funciones agregadas calculan un resultado único a partir de un conjunto de valores de entrada.

SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table 
GROUP BY col2;

demostración de db<>violín


Manejo MySQL de GROUP BY :

En SQL estándar, una consulta que incluye una cláusula GROUP BY no puede hacer referencia a columnas no agregadas en la lista de selección que no estén nombradas en la cláusula GROUP BY.

y:

MySQL extiende el uso de GROUP BY para que la lista de selección pueda hacer referencia a columnas no agregadas que no se mencionan en la cláusula GROUP BY. Esto significa que la consulta anterior es legal en MySQL. Puede utilizar esta función para obtener un mejor rendimiento evitando la clasificación y agrupación de columnas innecesarias. Sin embargo, esto es útil principalmente cuando todos los valores de cada columna no agregada no mencionada en GROUP BY son los mismos para cada grupo. El servidor es libre de elegir cualquier valor de cada grupo, por lo que a menos que sean iguales, los valores elegidos son indeterminados.

Entonces, con la versión de MySQL sin una función agregada explícita, puede terminar con valores indeterministas. Recomiendo encarecidamente utilizar una función agregada específica.


EDITAR:

De MySQL Manejo de GROUP BY :

SQL92 y versiones anteriores no permiten consultas en las que la lista de selección, la condición HAVING o la lista ORDER BY hagan referencia a columnas no agregadas que no estén nombradas en la cláusula GROUP BY.

SQL99 y versiones posteriores permiten dichos no agregados según la característica opcional T301 si dependen funcionalmente de las columnas GROUP BY: si existe tal relación entre el nombre y el cliente, la consulta es legal. Este sería el caso, por ejemplo, si se custuviera una clave primaria de clientes.

Ejemplo:

SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o
JOIN customers AS c
  ON o.custid = c.custid
GROUP BY o.custid;
Lukasz Szozda avatar Nov 10 '2015 11:11 Lukasz Szozda

Alternativamente, en la respuesta de MySQL: no funcionaría en la versión 5.7 en adelante.

Puede utilizar ANY_VALUE()la función como se indica en la documentación de MySQL.

Fuentes: https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_any-value

Ejemplo:

SELECT MIN(col1), col2, ANY_VALUE(col3) FROM the_table GROUP BY col2
amnrzm avatar May 15 '2018 02:05 amnrzm