Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Consula a tres tablas jodida

Estas en el tema de Consula a tres tablas jodida en el foro de Bases de Datos General en Foros del Web. Hola tengo una Tabla PERSONA que tiene nombre direccion y otra tabla relacion con el telefono de la persona (pueden ser varios) y otra con ...
  #1 (permalink)  
Antiguo 15/01/2009, 16:50
Avatar de normandos  
Fecha de Ingreso: diciembre-2001
Mensajes: 216
Antigüedad: 22 años, 4 meses
Puntos: 0
Consula a tres tablas jodida

Hola tengo una Tabla PERSONA que tiene nombre direccion y otra tabla relacion con el telefono de la persona (pueden ser varios) y otra con mails (que pueden ser varios tambien).
Tabla Persona (persona_cod, persona_nombre, persona_direccion)
Tabla Telefono (persona_cod, persona_telefono)
Tabla Email (persona_cod, persona_email)

Tengo problemas en los select ya que me devuelve 6 filas completas si hay por ejemplo 2 telefonos y 3 mails dados de alta. Me retorna 1 fila por el registro que hay en Persona, 2 filas por los registros en Telefono y 3 filas por los registros en Email (en total 6). El problema es que repite los datos en cada registro que devuelve.
Como enlazo los datos a un gridview no los muestra correctamente.

Mi select:
GO
ALTER PROCEDURE [dbo].[MostrarPersona]
@cod int
AS
BEGIN
Select *
from Persona, Telefono, Email
Where Persona.persona_cod = @cod and Persona.persona_cod=Telefono.persona_cod and Persona.persona_cod = Email.persona_cod
END

que esta mal del select?
Gracias
__________________
"No importa lo que nos suceda sino cómo reaccionamos ante lo que nos sucede."

Presidente James E. Faust
  #2 (permalink)  
Antiguo 16/01/2009, 04:15
 
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid, España
Mensajes: 149
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Consula a tres tablas jodida

¿Cómo querrías mostrar el resultado?
  #3 (permalink)  
Antiguo 16/01/2009, 13:11
Avatar de normandos  
Fecha de Ingreso: diciembre-2001
Mensajes: 216
Antigüedad: 22 años, 4 meses
Puntos: 0
Respuesta: Consula a tres tablas jodida

Me gustaria:

Nombre: Juan
Apellido: Delgado
Direccion: Los Olivos 3456
Telefono Nº 1: 12345
Teléfono Nº 2: 23456
Email Nº 1: [email protected]
Email Nº 2: [email protected]
Email Nº 3: [email protected]
__________________
"No importa lo que nos suceda sino cómo reaccionamos ante lo que nos sucede."

Presidente James E. Faust
  #4 (permalink)  
Antiguo 19/01/2009, 04:11
 
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid, España
Mensajes: 149
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Consula a tres tablas jodida

Si quieres obtenerlo todo en una fila, ten en cuenta que un SELECT simple no te sirve ya que lo más seguro es que el motor de SQL esté realizando un LEFT JOIN. Deberías concatenar el resultado de ejecutar el select correspondiente a cada tabla (Telefonos e Emails) Y devolver ese resultado como un campo de la consulta principal (llamando, por ejemplo, a los campos "Telefonos" y "Emails"). Al menos, yo tiraría por ahí.


Dos puntualizaciones sobre esto que te digo:

1- Devolver todos los valores del campo que se itera (bien sea Telefono o Email) en un solo campo por una sencilla razón: si cada persona puede tener diferente número de emails o teléfonos, tendrías que generar tantos campos en la query como emails/telefonos tenga la persona. Esto parece muy complejo para un caso aparentemente sencillo. Además, piensa en el caso de que, en lugar de recuperar los datos de una persona, tuvieses que hacerlo de varias: tendrías que calcular primiero el número máxio de emails / telefonos de las personas a consultar para saber cuántos campos devolver. Si tienes que actualizar desde ese grid la información de teléfonos/emails, entonces quizá te acosejaría que sacases tres grids: uno con la lista de personas y otros dos con la lista de teléfonos / mails de la persona seleccionada en el primer grid.

2 - Cuidado con llamar a un campo de una tabla igual que a la tabla (Telefono-Telefono, Email-Email), te puede equivocar al programar.

Espero que esto te de una idea de por dónde tirar. Un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:23.