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

Unión de 3 tablas, consulta rara :p...

Estas en el tema de Unión de 3 tablas, consulta rara :p... en el foro de SQL Server en Foros del Web. Hola a todos!!! Pues miren eh realizado ya consultas intercalando tres tablas y me funciona bien... en mi caso son estas tres: b_kardex2, b_traba1 y ...
  #1 (permalink)  
Antiguo 28/10/2011, 10:54
Avatar de stuart_david3  
Fecha de Ingreso: agosto-2011
Mensajes: 215
Antigüedad: 12 años, 7 meses
Puntos: 1
Información Unión de 3 tablas, consulta rara :p...

Hola a todos!!! Pues miren eh realizado ya consultas intercalando tres tablas y me funciona bien... en mi caso son estas tres: b_kardex2, b_traba1 y c_puesto, ahora mi consulta ya funcionando es esta:

Código SQL:
Ver original
  1. SELECT A.rpe, C.cl_puest, C.puesto FROM b_kardex2 AS BK INNER JOIN b_traba1 AS A ON BK.rpe=A.rpe INNER JOIN c_puesto AS C ON BK.cl_puest=C.cl_puest GROUP BY A.rpe, C.cl_puest, C.puesto

La misma que intento implementar en otra consulta es esta:

Código SQL:
Ver original
  1. b_kardex2 AS BK INNER JOIN b_traba1 AS A ON BK.rpe=A.rpe INNER JOIN c_puesto AS C ON BK.cl_puest=C.cl_puest

El problema ocurre cuando la implemento en una consulta mucho más grande en la cual selecciono algunos campos de una tabla que se llama: b_traba1 (rpe, nombre, fe_ingre, fe_antre, sexo_trab, cl_nides, if_nire2) y algunos campos de otras tablas relacionandolas con la tabla b_traba1, (tabla b_traba3 para el campo "fe_natra", b_kardex2 para "im_saldi", c_zonas para "nombre" y c_ubica para "ubicapza") y de la cual voy determinando mediante la misma consulta el numero de años que el trabajador tiene en la empresa, así solo muestro a los trabajadores hombres con más de 25 años en la empresa y más de 55 años de edad.

Código SQL:
Ver original
  1. WHERE (DATEDIFF(yy, b_traba1.fe_antre, GETDATE()) > 25) AND (DATEDIFF(yy, b_traba3.fe_natra, GETDATE()) > 55)

También determino los años que han transcurrido desde que el trabajador se pudo haber jubilado en el campo "anyjub", dependiendo si es hombre deben ser 30 años y si es mujer 25 así como la fecha en la que debió haberse jubilado "fe":

Código SQL:
Ver original
  1. CONVERT (INT,(DATEDIFF (dd, GETDATE(), fe) - DATEDIFF (yy, GETDATE(), fe) / 4.25) / 365) AS anyjub FROM (SELECT fe_antre, CASE WHEN b_traba1.sexotrab='M' THEN DATEADD(yy, 30, b_traba1.fe_antre) ELSE DATEADD(yy, 25, b_traba1.fe_antre) END AS fe FROM b_traba1) AS t1 INNER JOIN b_traba1 AS b3 ON t1.fe_antre=b3.fe_antre

La fecha en la que se podrá jubilar "fepos" (que sería la fecha actual si su fecha ya paso):

Código SQL:
Ver original
  1. CASE WHEN fe<GETDATE() THEN GETDATE() ELSE NULL END AS fepos

Su edad:

Código SQL:
Ver original
  1. CONVERT (INT,(DATEDIFF (dd, b_traba3.fe_natra, GETDATE()) - DATEDIFF (yy, b_traba3.fe_natra, GETDATE()) / 4.25) / 365) AS Edad

Y bueno eso sería la consulta, hasta el momento antes de agregar la ultima parte de la consulta en la que la involucraba la unión de tres tablas (para mostrar la columna "puesto" de la tabla c_puesto) funcionaba bien, pero ahora todos mis registros se repiten a excepción de los últimos 3 (fe, fepos y anyjub) son los únicos que si varían, y en mi consulta no se por que rayos me pide el sql que todos mis elementos del select los incluya en el group by, así que descarto agruparlos por algún registro, o cómo haría esto, ahm pero tal vez eso no tenga nada que ver... En fin mi consulta completa es esta:

Código SQL:
Ver original
  1. SELECT TOP 10 b.nombre, A.rpe, b_traba1.nombre, b_traba1.fe_antre, b_traba1.fe_ingre, b2.fe_natra, BK.im_saldi, C.puesto, CONVERT (INT,(DATEDIFF (dd, b_traba3.fe_natra, GETDATE()) - DATEDIFF (yy, b_traba3.fe_natra, GETDATE()) / 4.25) / 365) AS Edad, b_traba1.sexotrab, b4.ubicapza, b_traba1.cl_nides, b_traba1.if_nire2, fe, CASE WHEN fe<GETDATE() THEN GETDATE() ELSE NULL END AS fepos, CONVERT (INT,(DATEDIFF (dd, GETDATE(), fe) - DATEDIFF (yy, GETDATE(), fe) / 4.25) / 365) AS anyjub FROM (SELECT fe_antre, CASE WHEN b_traba1.sexotrab='M' THEN DATEADD(yy, 30, b_traba1.fe_antre) ELSE DATEADD(yy, 25, b_traba1.fe_antre) END AS fe FROM b_traba1) AS t1 INNER JOIN b_traba1 AS b3 ON t1.fe_antre=b3.fe_antre, b_traba1, b_traba3, b_traba1 AS BT INNER JOIN b_traba3 AS b2 ON BT.rpe=b2.rpe, b_traba1 AS BJ INNER JOIN c_zonas AS b ON BJ.cl_zona=b.descr, b_kardex2 AS BK INNER JOIN b_traba1 AS A ON BK.rpe=A.rpe INNER JOIN c_puesto AS C ON BK.cl_puest=C.cl_puest, b_traba1 AS BU INNER JOIN c_ubica AS b4 ON BU.cl_ubica=b4.cl_ubica, c_puesto WHERE (DATEDIFF(yy, b_traba1.fe_antre, GETDATE()) > 25) AND (DATEDIFF(yy, b_traba3.fe_natra, GETDATE()) > 55)  GROUP BY b.nombre, b_traba1.nombre, b_traba1.fe_antre, b_traba1.fe_ingre, b2.fe_natra, BK.im_saldi, C.puesto, b_traba1.sexotrab, b4.ubicapza, b_traba1.cl_nides, b_traba1.if_nire2, b_traba3.fe_natra, fe, A.rpe

Lo que hago ahora es el uso de alias en las tablas pero lo único que eh logrado es lo que mencione, que si me variaran los últimos tres registros los demás se repiten y repiten... Tal vez sean mis INNER JOIN ... antes solo igualaba con un WHERE mis tablas haciendo referencia al registro común entre las tablas pero no hubo gran diferencia... Espero no revolverlos tanto y no molestarlos, me gustaría y me pudiesen ayudar... Gracias de anteamano...
  #2 (permalink)  
Antiguo 28/10/2011, 11:49
Avatar de stuart_david3  
Fecha de Ingreso: agosto-2011
Mensajes: 215
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Unión de 3 tablas, consulta rara :p...

Ok lo intenté de esta manera sin incluir el campo "puesto" y funcionó bien la consulta:

Código SQL:
Ver original
  1. SELECT c_zonas.nombre, c_a_resp.dscarea, b_traba1.rpe, b_traba1.nombre, b_traba1.fe_antre, b_traba1.fe_ingre, b_traba3.fe_natra, b_kardex2.im_saldi, CONVERT (INT,(DATEDIFF (dd, b_traba3.fe_natra, GETDATE()) - DATEDIFF (yy, b_traba3.fe_natra, GETDATE()) / 4.25) / 365) AS Edad, b_traba1.sexotrab, c_ubica.ubicapza, b_traba1.cl_nides, b_traba1.if_nire2, fe, CASE WHEN fe<GETDATE() THEN GETDATE() ELSE NULL END AS fepos, CONVERT (INT,(DATEDIFF (dd, GETDATE(), fe) - DATEDIFF (yy, GETDATE(), fe) / 4.25) / 365) AS anyjub FROM (SELECT fe_antre, CASE WHEN b_traba1.sexotrab='M' THEN DATEADD(yy, 30, b_traba1.fe_antre) ELSE DATEADD(yy, 25, b_traba1.fe_antre) END AS fe FROM b_traba1) AS t1, b_traba1, b_traba3, c_zonas, c_a_resp, b_kardex2, c_ubica, c_puesto WHERE (DATEDIFF(yy, b_traba1.fe_antre, GETDATE()) > 25) AND (DATEDIFF(yy, b_traba3.fe_natra, GETDATE()) > 55) AND c_zonas.descr=b_traba1.cl_zona AND c_a_resp.area=b_traba1.area AND b_traba1.rpe=b_traba3.rpe AND b_traba1.fe_antre=t1.fe_antre AND b_traba1.rpe=b_kardex2.rpe AND b_traba1.cl_ubica=c_ubica.cl_ubica GROUP BY c_zonas.nombre, c_a_resp.dscarea, b_traba1.rpe, b_traba1.nombre, b_traba1.fe_antre, b_traba1.fe_ingre, b_traba3.fe_natra, b_kardex2.im_saldi, b_traba1.sexotrab, c_ubica.ubicapza, b_traba1.cl_nides, b_traba1.if_nire2, fe

Ahora al incluir este campo y mezclar 3 tablas me repite varios registros ...

Código SQL:
Ver original
  1. SELECT TOP 10 c_zonas.nombre, c_a_resp.dscarea, b_traba1.rpe, b_traba1.nombre, b_traba1.fe_antre, b_traba1.fe_ingre, b_traba3.fe_natra, b_kardex2.im_saldi, CONVERT (INT,(DATEDIFF (dd, b_traba3.fe_natra, GETDATE()) - DATEDIFF (yy, b_traba3.fe_natra, GETDATE()) / 4.25) / 365) AS Edad, b_traba1.sexotrab, c_ubica.ubicapza, b_traba1.cl_nides, b_traba1.if_nire2, c_puesto.puesto, fe, CASE WHEN fe<GETDATE() THEN GETDATE() ELSE NULL END AS fepos, CONVERT (INT,(DATEDIFF (dd, GETDATE(), fe) - DATEDIFF (yy, GETDATE(), fe) / 4.25) / 365) AS anyjub FROM (SELECT fe_antre, CASE WHEN b_traba1.sexotrab='M' THEN DATEADD(yy, 30, b_traba1.fe_antre) ELSE DATEADD(yy, 25, b_traba1.fe_antre) END AS fe FROM b_traba1) AS t1, b_traba1, b_traba3, c_zonas, c_a_resp, b_kardex2, c_ubica, c_puesto WHERE (DATEDIFF(yy, b_traba1.fe_antre, GETDATE()) > 25) AND (DATEDIFF(yy, b_traba3.fe_natra, GETDATE()) > 55) AND c_zonas.descr=b_traba1.cl_zona AND c_a_resp.area=b_traba1.area AND b_traba1.rpe=b_traba3.rpe AND b_traba1.fe_antre=t1.fe_antre AND (b_traba1.rpe=b_kardex2.rpe AND c_puesto.cl_puest=b_kardex2.cl_puest) AND b_traba1.cl_ubica=c_ubica.cl_ubica GROUP BY c_zonas.nombre, c_a_resp.dscarea, b_traba1.rpe, b_traba1.nombre, b_traba1.fe_antre, b_traba1.fe_ingre, b_traba3.fe_natra, b_kardex2.im_saldi, b_traba1.sexotrab, c_ubica.ubicapza, b_traba1.cl_nides, b_traba1.if_nire2, c_puesto.puesto, fe

Selecciono los 10 primeros por que si pongo todos me marca un valor del timeout caducado ya que esta consulta la estoy ejecutando desde una página en asp.net...

No se que onda, si haciendo la consulta de las tres tablas independientes si me funciona ...
  #3 (permalink)  
Antiguo 28/10/2011, 14:21
Avatar de stuart_david3  
Fecha de Ingreso: agosto-2011
Mensajes: 215
Antigüedad: 12 años, 7 meses
Puntos: 1
Respuesta: Unión de 3 tablas, consulta rara :p...

Bueno si de algo sirve esto es lo que me muestra la tabla...

Ala!!! Borré la tabla es que se veía obscenamente grande y desordenada -.- :s...

Etiquetas: 3-tablas, registros, sql, tablascruzadas, aspx
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 06:39.