Subconsulta correlacionada


02 de Marzo del 2017

 

select * from cliente, factura where factura.importe= (select max(importe) from factura);

 

Quiero sacar todos los datos de clientes con su respectiva factura donde muestre el importe maximo para cada cliente. A ver si podeis echarme una mano gracias


David Carrero
12 de Agosto del 2026

Hola,

Tu consulta tiene dos problemas, no solo uno. El primero: select * from cliente, factura where ... usa el estilo antiguo de JOIN separando tablas por comas, pero no le has puesto ninguna condición que relacione cliente con factura (te falta algo como cliente.id = factura.cliente_id). Sin esa condición, MySQL cruza cada cliente con cada factura de la tabla entera, no solo con las suyas.

El segundo, más de fondo: (select max(importe) from factura) calcula el importe máximo de toda la tabla factura, un único valor global compartido por todos los clientes. Con eso, la consulta solo te va a devolver el cliente (o clientes) que tengan la factura más cara de toda la base de datos, no la factura más cara de cada uno.

Para que el máximo se calcule «por cliente» en vez de en global, la subconsulta necesita estar correlacionada con el cliente de la fila externa:

SELECT c.*, f.*
FROM cliente c
JOIN factura f ON f.cliente_id = c.id_cliente
WHERE f.importe = (
    SELECT MAX(f2.importe)
    FROM factura f2
    WHERE f2.cliente_id = f.cliente_id
);

(ajusta c.id_cliente y f.cliente_id a los nombres reales de tus columnas si son distintos, la idea es la misma sea cual sea el nombre.)

La diferencia clave está en el WHERE f2.cliente_id = f.cliente_id de la subconsulta: eso hace que, para cada fila de factura que se evalúa en la consulta externa, el MAX se calcule solo entre las facturas de ese mismo cliente, no de todos. Es lo que se llama una subconsulta correlacionada, se ejecuta «una vez por cada cliente» en vez de una única vez para toda la tabla.

Un saludo,
David Carrero