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

Problema con SQL Anidada con LEF e INNER JOIN

Estas en el tema de Problema con SQL Anidada con LEF e INNER JOIN en el foro de Bases de Datos General en Foros del Web. Saludos Me ha costado llegar a la solucion de una SQL, realmente una SQL que ya tenia y funciona bien, hasta que me indicaron que ...
  #1 (permalink)  
Antiguo 04/07/2011, 13:03
 
Fecha de Ingreso: octubre-2005
Mensajes: 76
Antigüedad: 18 años, 6 meses
Puntos: 5
Problema con SQL Anidada con LEF e INNER JOIN

Saludos

Me ha costado llegar a la solucion de una SQL, realmente una SQL que ya tenia y funciona bien, hasta que me indicaron que esta no solo debia cargar los registros que coincidieran entre dos tablas, sino que traiga tambien los que no emparejen entre ellas.

La SQL, como decia, hacia su cometido pero filtrado todo con WHERE.
Es una relacion entre la tabla EMPLEADOS y otra llamada PAGO_PRIMA_LEGAL

El WHERE obviamente solo me traeria registros de Empleados que tengan datos en la 2da tabla, pero como ahora me indican que debe cargarse tambien los Empleados que igual no tengan registros de la 2da tabla, es claro que debo cambiar el WHERE por LEFT JOIN y en otros casos INNER JOIN.

Este es el archivo Excel donde llenan los datos a mano:
http://www.pasteall.org/pic/show.php?id=14552

Y esta es la salida de la SQL que he hecho que haga lo mismo: (esta en Access)
http://www.pasteall.org/pic/show.php?id=14553

Me costo algo que esa informacion saliese de forma horizontal y no vertical, la SQL completa es esta:
http://pastie.org/2163862

Realmente, si se fijan Dia2 es una copia de Dia1 pero filtrando por numDia=2, numDia=3, numDia=4... etc.

La SQL originalmente reducida o desde su inicio seria esta:

Código SQL:
Ver original
  1. SELECT DISTINCT (PPL.numemple), E.apellido+" "+E.nombre AS Nombre,
  2.  
  3. (SELECT Ausencia.alias FROM pago_prima_legal PPL1, PPL_leyenda Ausencia WHERE PPL1.numemple=PPL.numemple AND PPL1.fechaElab BETWEEN RP.fechaDEL AND RP.fechaAL AND PPL1.id_status=Ausencia.id AND NumDia=1) AS Dia1
  4.  
  5. FROM pago_prima_legal AS PPL, empleados AS E, PPL_leyenda AS STATUS, reportes AS RP
  6. WHERE PPL.numemple=E.numempleado AND PPL.fechaElab BETWEEN RP.fechaDEL AND RP.fechaAL AND PPL.id_status=STATUS.id
  7. GROUP BY PPL.numemple, E.nombre, E.apellido, RP.fechaDEL, RP.fechaAL, STATUS.alias;

He tenido errores al intentar hacer una SQL en vez de WHERE, con INNER JOIN, LEFT JOIN, etc de mas de 2 tablas relacionadas, es decir, JOINs multiples.

En los Screenshot, puede verse en el de la Hoja de Calculo, que he marcado con unos puntos azules unos registros de empleado, esos son los que no tienen nada en la 2da tabla. Obviamente mientras la SQL este filtrando bajo WHERE y no por LEFT JOIN pues nunca me van a salir los Empleados en blanco que no tengan relacion con la 2da tabla.

Un JOIN entre dos tablas me resulta bien, pero cuando intento hacer crecer la SQL anexando una 3era tabla o mas, pues es cuando tengo el FAIL.

He tratado de hacer pruebas con esto, pero sin resultado:

Código SQL:
Ver original
  1. SELECT DISTINCT (PPL.numemple), E.apellido+" "+E.nombre AS Nombre,
  2.  
  3. (SELECT Ausencia.alias FROM pago_prima_legal PPL1, PPL_leyenda Ausencia WHERE PPL1.numemple=PPL.numemple AND PPL1.fechaElab BETWEEN #01/05/2011# AND #31/05/2011# AND PPL1.id_status=Ausencia.id AND NumDia=1) AS Dia1
  4.  
  5. FROM empleados AS E
  6. LEFT JOIN pago_prima_legal AS PPL ON E.numempleado=PPL.numemple
  7. INNER JOIN PPL_leyenda STATUS ON PPL.id_status=STATUS.id
  8. WHERE PPL.fechaElab BETWEEN #01/05/2011# AND #31/05/2011#
  9. GROUP BY PPL.numemple, E.nombre, E.apellido, RP.fechaDEL, RP.fechaAL, STATUS.alias;

He lidiado con este desde el Sabado mirando en Google y ya hoy Lunes pues considere que ya debia pedir algo de ayuda.

Última edición por UserCod; 04/07/2011 a las 14:25
  #2 (permalink)  
Antiguo 05/07/2011, 13:23
 
Fecha de Ingreso: octubre-2005
Mensajes: 76
Antigüedad: 18 años, 6 meses
Puntos: 5
Respuesta: Problema con SQL Anidada con LEF e INNER JOIN

Bueno ya hice otra SQL: http://pastie.org/2169384

que a diferencia de la primera, esta tambien carga los empleados que no tienen registro en la tabla de los datos
ya que la anterior SQL era todo bajo WHERE pero esta los Sub con INNER JOIN y la SQL padre con LEFT JOIN, listo.

Última edición por UserCod; 05/07/2011 a las 16:03

Etiquetas: join, sql, bases-de-datos
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:12.