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

seleccion compleja y completa

Estas en el tema de seleccion compleja y completa en el foro de Bases de Datos General en Foros del Web. Buenos dias gente. Tengo las siguientes tablas: medicamento(id, nombre) persona(id, nombre) cliente(id, tipo) clientepersona(idcliente, idpersona) empresa(id, nombre, idpersonadueno) establecimiento(id, idempresa, nombre) clienteestablecimiento(idcliente, idestablecimiento) remitosalida(id, numeroremito, ...
  #1 (permalink)  
Antiguo 27/08/2015, 08:31
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
seleccion compleja y completa

Buenos dias gente.

Tengo las siguientes tablas:

medicamento(id, nombre)
persona(id, nombre)
cliente(id, tipo)
clientepersona(idcliente, idpersona)
empresa(id, nombre, idpersonadueno)
establecimiento(id, idempresa, nombre)
clienteestablecimiento(idcliente, idestablecimiento)
remitosalida(id, numeroremito, serieremito, fecharemito, idcliente)
remitosalidadetalle(idremitosalida, idmedicamento, cantidad)

yo tengo que listar todos los remitos de salidas con su detalle, el medicamnto y el cliente del remito,
el tema que como hay varios cliente no se como hacer, puede llegar a sacar todos los remitos con su detalle, su medicamento y su cliente pero solo de un tipo de cliente (es decir de cliente persona por ejemplo, qie para sacar los datos de la persona hago join con persona).

pero tengo que listar todos los remitos con los clientepersonas y los clienteestablecimiento.

esto lo que yo hago:
Código SQL:
Ver original
  1. SELECT vrsd.rsd_idmedicamento,vresa.resa_fecharemito,vresa.resa_numeroremito,vresa.resa_serie , vrsd.rsd_cantidad, vcli.cli_id,vper.*
  2. FROM vet_remitosalida vresa,vet_remitosalidadetalle vrsd,vet_cliente vcli, vet_clientepersona vclpe, vet_persona vper,
  3. WHERE
  4. vresa.resa_idcliente = vcli.cli_id
  5. AND vcli.cli_id IN (
  6. SELECT vclpe2.clpe_idcliente FROM vet_clientepersona vclpe2 WHERE vclpe2.clpe_idcliente = vclpe.clpe_idcliente
  7. AND vclpe2.clpe_idpersona = vper.per_id)
con esto puedo sacar los remitos del clientepersona con los datos de la persona

pero despues de los parentisis le pongo

or (vcli in(aca hago la seleccion con cliente establecimiento, con empresa y con el dueno de la empresa y me tiro muchas filas que no son las que tengo registradas)

Desde ya muchas gracias
Saludos

Última edición por gnzsoloyo; 28/08/2015 a las 05:40 Razón: SQL sin etiquetar.
  #2 (permalink)  
Antiguo 27/08/2015, 13:26
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: seleccion compleja y completa

manejador de bases de datos???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 27/08/2015, 14:13
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa

Cita:
Iniciado por Libras Ver Mensaje
manejador de bases de datos???

Gracias por tu respuesta.
Utlizo phpMyAdmin mysql , no se la version

Un saludo
  #4 (permalink)  
Antiguo 27/08/2015, 22:42
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa

CREO que lo pude solucionar, si esta mal por favor avisenme.

Código SQL:
Ver original
  1. SELECT
  2. resa_fecharemito AS resa_fecharemito,
  3. resa_numeroremito AS resa_numeroremito,
  4. resa_serie AS resa_serie,
  5. resa_idcliente AS resa_idcliente,
  6. rsd_idmedicamento AS rsd_idmedicamento,
  7. rsd_cantidad AS rsd_cantidad,
  8. per_id AS per_id,
  9. per_nombre AS per_nombre,
  10. per_apellido AS per_apellido,
  11. cli_numerosocio AS cli_numerosocio,
  12. '' AS est_idestablecimiento,
  13. '' AS est_dicose,
  14. '' AS emp_id,
  15. '' AS emp_rut
  16. FROM
  17. ((((vet_remitosalida
  18. JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa)
  19. JOIN vet_cliente ON cli_id = resa_idcliente)
  20. JOIN vet_clientepersona ON clpe_idcliente = cli_id)
  21. JOIN vet_persona ON per_id = clpe_idpersona)
  22. UNION
  23. SELECT
  24. resa_fecharemito AS resa_fecharemito,
  25. resa_numeroremito AS resa_numeroremito,
  26. resa_serie AS resa_serie,
  27. resa_idcliente AS resa_idcliente,
  28. rsd_idmedicamento AS rsd_idmedicamento,
  29. rsd_cantidad AS rsd_cantidad,
  30. per_id AS per_id,
  31. per_nombre AS per_nombre,
  32. per_apellido AS per_apellido,
  33. cli_numerosocio AS cli_numerosocio,
  34. est_idestablecimiento AS est_idestablecimiento,
  35. est_dicose AS est_dicose,
  36. emp_id AS emp_id,
  37. emp_rut AS emp_rut
  38. FROM
  39. ((((((vet_remitosalida
  40. JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa)
  41. JOIN vet_cliente ON cli_id = resa_idcliente)
  42. JOIN vet_clienteestablecimiento ON cles_idcliente = cli_id)
  43. JOIN vet_establecimiento ON est_idestablecimiento = cles_idestablecimiento)
  44. JOIN vet_empresa ON emp_id = est_idempresa)
  45. JOIN vet_persona ON per_id = emp_idpersonadueno);

Muchas Gracias

Última edición por gnzsoloyo; 28/08/2015 a las 05:40 Razón: SQL sin etiquetar.
  #5 (permalink)  
Antiguo 28/08/2015, 05:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: seleccion compleja y completa

Mal, no. Ineficiente, posiblemente.
Consejo básico: No uses semejante cadena de parentesis anidados. El parser de MySQL los puede interpretar como segmentación de la consulta en subconsultas anidadas y el resultado a nivel performace puede ser catastrófico si la selectividad de sus relaciones no está bien calibrada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 28/08/2015, 08:17
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Mal, no. Ineficiente, posiblemente.
Consejo básico: No uses semejante cadena de parentesis anidados. El parser de MySQL los puede interpretar como segmentación de la consulta en subconsultas anidadas y el resultado a nivel performace puede ser catastrófico si la selectividad de sus relaciones no está bien calibrada.
Gracias por responder.

Si lo de Ineficiente es posible, pero no he encontrado otra forma de hacerlo, si puedes darme una mano te lo agradeceria.

desde ya muchas gracias.
Saludos
  #7 (permalink)  
Antiguo 28/08/2015, 08:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: seleccion compleja y completa

Veamos...

Dime qué te devuelve esto:
Código MySQL:
Ver original
  1.     resa_fecharemito,
  2.     resa_numeroremito,
  3.     resa_serie,
  4.     resa_idcliente,
  5.     rsd_idmedicamento,
  6.     rsd_cantidad,
  7.     per_id,
  8.     per_nombre,
  9.     per_apellid,
  10.     cli_numerosocio,
  11.     IFNULL(est_idestablecimiento, '') est_idestablecimiento,
  12.     IFNULL(est_dicose, '') est_dicose,
  13.     IFNULL(emp_id, '') emp_id,
  14.     IFNULL(emp_rut, '') emp_rut
  15.     vet_remitosalida
  16.     INNER JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa
  17.     INNER JOIN vet_cliente ON cli_id = resa_idcliente
  18.     INNER JOIN vet_clienteestablecimiento ON cles_idcliente = cli_id
  19.     LEFT JOIN vet_establecimiento ON est_idestablecimiento = cles_idestablecimiento
  20.     INNER JOIN vet_empresa ON emp_id = est_idempresa
  21.     INNER JOIN vet_persona ON per_id = emp_idpersonadueno;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 28/08/2015, 12:10
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Veamos...

Dime qué te devuelve esto:
Código MySQL:
Ver original
  1.     resa_fecharemito,
  2.     resa_numeroremito,
  3.     resa_serie,
  4.     resa_idcliente,
  5.     rsd_idmedicamento,
  6.     rsd_cantidad,
  7.     per_id,
  8.     per_nombre,
  9.     per_apellid,
  10.     cli_numerosocio,
  11.     IFNULL(est_idestablecimiento, '') est_idestablecimiento,
  12.     IFNULL(est_dicose, '') est_dicose,
  13.     IFNULL(emp_id, '') emp_id,
  14.     IFNULL(emp_rut, '') emp_rut
  15.     vet_remitosalida
  16.     INNER JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa
  17.     INNER JOIN vet_cliente ON cli_id = resa_idcliente
  18.     INNER JOIN vet_clienteestablecimiento ON cles_idcliente = cli_id
  19.     LEFT JOIN vet_establecimiento ON est_idestablecimiento = cles_idestablecimiento
  20.     INNER JOIN vet_empresa ON emp_id = est_idempresa
  21.     INNER JOIN vet_persona ON per_id = emp_idpersonadueno;
Código MySQL:
Ver original
  1.  resa_fecharemito,
  2.  resa_numeroremito,
  3.  resa_serie,
  4.  resa_idcliente,
  5.  rsd_idmedicamento,
  6.  rsd_cantidad,
  7.  per_id,
  8.  per_nombre,
  9.  per_apellido,
  10.  cli_numerosocio,
  11.  IFNULL(est_idestablecimiento, '')est_idestablecimiento,
  12.  IFNULL(est_dicose, '')est_dicose,
  13.  IFNULL(emp_id, '')emp_id,
  14.  IFNULL(emp_rut, '')emp_rut
  15.  vet_remitosalida
  16.  INNER JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa
  17.  INNER JOIN vet_cliente ON cli_id = resa_idcliente
  18.  INNER JOIN vet_clienteestablecimiento ON cles_idcliente = cli_id
  19.  LEFT JOIN vet_establecimiento ON est_idestablecimiento = cles_idestablecimiento
  20.  INNER JOIN vet_empresa ON emp_id = est_idempresa
  21.  INNER JOIN vet_persona ON per_id = emp_idpersonadueno;

esta consulta solamente me devuelve los remitos que son realizados por clientes establecimientos, es decir que, lo que en mi consulta queda vacio por '' as est_idestablecimiento, '' as est_dicose,'' as emp_id, '' as emp_rut no me lo muestra.

Desde ya muchas gracias.

Saludos

Última edición por gnzsoloyo; 28/08/2015 a las 16:10
  #9 (permalink)  
Antiguo 28/08/2015, 12:35
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa



http://www.imageshost.eu/image/DlH

en el 1 es lo que devuelve mi consulta y
en el 2 es lo que devuelve tu consulta.

Muhas Gracias.

Saludos
  #10 (permalink)  
Antiguo 28/08/2015, 16:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: seleccion compleja y completa

Vamos de nuevo, afinando:
Código MySQL:
Ver original
  1.     resa_fecharemito,
  2.     resa_numeroremito,
  3.     resa_serie,
  4.     resa_idcliente,
  5.     rsd_idmedicamento,
  6.     rsd_cantidad,
  7.     per_id,
  8.     per_nombre,
  9.     per_apellid,
  10.     cli_numerosocio,
  11.     IFNULL(est_idestablecimiento, '') est_idestablecimiento,
  12.     IFNULL(est_dicose, '') est_dicose,
  13.     IFNULL(emp_id, '') emp_id,
  14.     IFNULL(emp_rut, '') emp_rut
  15.     vet_remitosalida
  16.     INNER JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa
  17.     INNER JOIN vet_cliente ON cli_id = resa_idcliente
  18.     INNER JOIN vet_clienteestablecimiento ON cles_idcliente = cli_id
  19.     LEFT JOIN vet_establecimiento ON est_idestablecimiento = cles_idestablecimiento
  20.     INNER JOIN vet_empresa ON emp_id = est_idempresa
  21.     INNER JOIN vet_persona ON per_id = emp_idpersonadueno
  22. WHERE 1 OR est_idestablecimiento IS NULL;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 28/08/2015, 17:14
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vamos de nuevo, afinando:
Código MySQL:
Ver original
  1.     resa_fecharemito,
  2.     resa_numeroremito,
  3.     resa_serie,
  4.     resa_idcliente,
  5.     rsd_idmedicamento,
  6.     rsd_cantidad,
  7.     per_id,
  8.     per_nombre,
  9.     per_apellid,
  10.     cli_numerosocio,
  11.     IFNULL(est_idestablecimiento, '') est_idestablecimiento,
  12.     IFNULL(est_dicose, '') est_dicose,
  13.     IFNULL(emp_id, '') emp_id,
  14.     IFNULL(emp_rut, '') emp_rut
  15.     vet_remitosalida
  16.     INNER JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa
  17.     INNER JOIN vet_cliente ON cli_id = resa_idcliente
  18.     INNER JOIN vet_clienteestablecimiento ON cles_idcliente = cli_id
  19.     LEFT JOIN vet_establecimiento ON est_idestablecimiento = cles_idestablecimiento
  20.     INNER JOIN vet_empresa ON emp_id = est_idempresa
  21.     INNER JOIN vet_persona ON per_id = emp_idpersonadueno
  22. WHERE 1 OR est_idestablecimiento IS NULL;
Muchas gracias por responder.

Me sigue dando lo mismo que la anterior, lo mismo que en la imagen.

Desde ya muchas gracias.
Saludos
  #12 (permalink)  
Antiguo 28/08/2015, 19:04
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa

No estas haciendo join con la tabla clientepersona, yo no se como hacerlo de esa manera .

Gracias
  #13 (permalink)  
Antiguo 31/08/2015, 16:01
 
Fecha de Ingreso: noviembre-2010
Mensajes: 48
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: seleccion compleja y completa

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vamos de nuevo, afinando:
Código MySQL:
Ver original
  1.     resa_fecharemito,
  2.     resa_numeroremito,
  3.     resa_serie,
  4.     resa_idcliente,
  5.     rsd_idmedicamento,
  6.     rsd_cantidad,
  7.     per_id,
  8.     per_nombre,
  9.     per_apellid,
  10.     cli_numerosocio,
  11.     IFNULL(est_idestablecimiento, '') est_idestablecimiento,
  12.     IFNULL(est_dicose, '') est_dicose,
  13.     IFNULL(emp_id, '') emp_id,
  14.     IFNULL(emp_rut, '') emp_rut
  15.     vet_remitosalida
  16.     INNER JOIN vet_remitosalidadetalle ON resa_id = rsd_idresa
  17.     INNER JOIN vet_cliente ON cli_id = resa_idcliente
  18.     INNER JOIN vet_clienteestablecimiento ON cles_idcliente = cli_id
  19.     LEFT JOIN vet_establecimiento ON est_idestablecimiento = cles_idestablecimiento
  20.     INNER JOIN vet_empresa ON emp_id = est_idempresa
  21.     INNER JOIN vet_persona ON per_id = emp_idpersonadueno
  22. WHERE 1 OR est_idestablecimiento IS NULL;
Perdon mi ignorancia, esta consulta me tendría que devolver todo, o tengo que hacer otra similir y utilizar union??

Tu consulta
Union
Tu consulta (para los cliente personas)


Desde ya muchas gracias
Saludos

Etiquetas: ayuda!!, bases-de-datos, gracias, join, sql, union
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 04:36.