Cita:
Iniciado por gnzsoloyo Esa es la consulta base, pero no es la solución.
Para poder desplegar horizontalmente los teléfonos de cada cliente en una columna separada, tienes que agregar un INNER JOIN
por cada teléfono adicional que haya, tomando como referencia la cantidad de telefonos que tenga el cliente con mayor cantidad de ellos.
¿Se entiende bien?
Esto quiere decir que si tienes dos teléfonos en un cliente, pones dos INNER JOIN:
Código SQL:
Ver originalSELECT
cl.cli_id,
cl.cli_nombre,
cl.cli_ciudad,
cl.cli_direccion,
tl1.telefono telefono1,
tl2.telefono telefono2,
cl.cli_email
FROM tbl_clientes cl
INNER JOIN tbl_telefonos tl1 ON cl.cli_id=tl1.cli_id
LEFT JOIN tbl_telefonos tl2 ON cl.cli_id=tl2.cli_id
WHERE tl2.telefono IS NULL OR tl1.telefono = tl2.telefono
;
El problema es si se presenta algún caso donde haya más, por ejemplo cinco (5) teléfonos. Eso lo complica, dado que tendrás que cubrir todas las combinaciones de relaciones entre las tablas posibles, de modo que no se repitan los clientes, sino solamente devuelva teléfonos diferentes del mismo, o nulos.
La verdad es que salvo que haya una necesidad
absoluta e imposible de cubrir pragmáticamente, para crear este tipo de consultas, no es recomendable bajo ninguna circunstancia.
En mi experiencia, en las aplicaciones empresariales, cuando se tiene que recuperar una cantidad variable de items relacionados a un cliente dado, NUNCA se hace en la misma query donde se obtienen los datos del cliente, sino en una query separada. Los resultados se integran el la aplicación, y no en la consulta.
Buenas noches y gracias por sus respuestas.
La verdad es que en la tabla teléfonos se debe almacenar X numero de números telefónicos para cada usuario, por lo que no hay una cantidad exacta de números telefónicos. Es decir, como un usuario puede tener 2, otro puede tener 5. He visto que para estos casos, algunas personas usan la clausula CASE dentro de la consulta para mostrar fechas por año y cosas así de forma horizontal, pero la verdad no se si sea posible aplicar esto en este caso o como aplicarlo.
Seria posible hacer algo similar usando CASE y, de ser posible, como podría hacerlo?
De antemano, muchas gracias por su ayuda.