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

help me!!!

Estas en el tema de help me!!! en el foro de SQL Server en Foros del Web. Tengo un problema nesesito, traer registros de varias tablas concretamente esta asi los campos que nesesito : A.EMPLID, A.LAST_NAME, A.SECOND_LAST_NAME, A.FIRST_NAME, A.MIDDLE_NAME, A.BIRTHDATE, A.MAR_STATUS, A.SEX, ...
  #1 (permalink)  
Antiguo 21/08/2007, 17:51
Avatar de zeusdelolimpo  
Fecha de Ingreso: agosto-2007
Mensajes: 54
Antigüedad: 16 años, 8 meses
Puntos: 0
Sonrisa help me!!!

Tengo un problema nesesito, traer registros de varias tablas concretamente esta asi los campos que nesesito :

A.EMPLID, A.LAST_NAME, A.SECOND_LAST_NAME, A.FIRST_NAME, A.MIDDLE_NAME, A.BIRTHDATE, A.MAR_STATUS, A.SEX,
B.HOURLY_RT, B.CURRENCY_CD, B.PAYGROUP, B.COMPANY, B.GL_PAY_TYPE, B.ACTION, B.ACTION_REASON, B.EFFDT, B.ANNUAL_RT, B.DEPTID, B.FLSA_STATUS,
C.NATIONAL_ID_TYPE,
D.SWT_MAR_STATUS,
E.ADDRESS1, E.ADDRESS2, E.CITY, E.COUNTRY, E.POSTAL,
F.PHONE

y pertenecen a estas tablas :

PS_PERSONAL_DATA A, PS_JOB B, PS_PERS_NID C, PS_STATE_TAX_DATA D, PS_ADDRESSES E, PS_EMERGENCY_CNTCT F, PS_EMPLOYMENT G, PS_JOB_EARNS_DIST H

y todas las tablas se unen por el ID, que es "EMPLID";


A parte tengo que seleccionarla maxima fecha effectiva(EFFDT) [PS_JOB, PS_JOB_EARNS_DIST,PS_STATE_TAX_DATA,PS_ADDRESSES]
y la maxima secuencia efectiva(EFFSEQ)[PS_JOB, PS_JOB_EARNS_DIST ] y esto lo ago con esto(es ejemplo solo de una):

AND B.EFFDT = (SELECT MAX (PRIMERA.EFFDT)FROM PS_JOB PRIMERA WHERE B.EMPLID = PRIMERA.EMPLID)
AND B.EFFSEQ = (SELECT MAX (SEGUNDA.EFFSEQ)FROM PS_JOB SEGUNDA WHERE B.EMPLID = SEGUNDA.EMPLID)

Mi problema surge cuando quiero traer los registros y hago la consulta completa por que las tablas no tienen el mismo numero de
registros

nombre de la tabla No. de registros
PS_PERSONAL_DATA 8027
PS_JOB 2956
PS_PERS_NID 8248
PS_STATE_TAX_DATA 875
PS_ADDRESSES 7660
PS_EMERGENCY_CNTCT 15
PS_EMPLOYMENT 2053
PS_JOB_EARNS_DIST 3

mi tabla principal seria (PS_PERSONAL_DATA por que es la que tiene todos los empleados y es en la que me tengo que basar )
y cuando hago mis igualaciones con el ID (EMPLID) no me arroja ningun registro

y me tendria que traer 8027 registros (segun PS_PERSONAL_DATA)

de antemano muchas gracias
  #2 (permalink)  
Antiguo 21/08/2007, 18:01
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: help me!!!

¿Cual es el tipo de JOIN que estas ocupando?
  #3 (permalink)  
Antiguo 22/08/2007, 09:26
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: help me!!!

- Se incluyo el EffDt y EffSeq para las tablas que pusiste entre parentesis, excepto una que no se menciona en el listado de campos inicial (PS_JOB_EARNS_DIST) pero de querer agregarla seria de forma similar al resto.

Espero te sirva para empezar...

Saludos!


Código:
Select A.EMPLID
      ,A.LAST_NAME
      ,A.SECOND_LAST_NAME
      ,A.FIRST_NAME
      ,A.MIDDLE_NAME
      ,A.BIRTHDATE
      ,A.MAR_STATUS
      ,A.SEX
      --------------------
      ,B.EFFDT
      ,B.EffSeq
      ,B.HOURLY_RT
      ,B.CURRENCY_CD
      ,B.PAYGROUP
      ,B.COMPANY
      ,B.GL_PAY_TYPE
      ,B.[ACTION]
      ,B.ACTION_REASON
      ,B.EFFDT
      ,B.ANNUAL_RT
      ,B.DEPTID
      ,B.FLSA_STATUS
      --------------------
      ,isnull((Select Top 1 NATIONAL_ID_TYPE From PS_PERS_NID  Where  EMPLID = A.EMPLID),'')  AS NATIONAL_ID_TYPE
      --------------------
      ,D.EFFDT
      ,D.EffSeq
      ,D.SWT_MAR_STATUS
      --------------------
      ,E.EFFDT
      ,E.EffSeq
      ,E.ADDRESS1
      ,E.ADDRESS2
      ,E.CITY
      ,E.COUNTRY
      ,E.POSTAL
      --------------------
      ,isnull((Select Top 1 PHONE From PS_EMERGENCY_CNTCT  Where  EMPLID = A.EMPLID),'')  AS PHONE
From  PS_PERSONAL_DATA A
Letf outer join
     (Select Jobs.EmplId
            ,Jobs.HOURLY_RT
            ,Jobs.CURRENCY_CD
            ,Jobs.PAYGROUP
            ,Jobs.COMPANY
            ,Jobs.GL_PAY_TYPE
            ,Jobs.ACTION
            ,Jobs.ACTION_REASON
            ,Jobs.EFFDT
            ,Jobs.EffSeq
            ,Jobs.ANNUAL_RT
            ,Jobs.DEPTID
            ,Jobs.FLSA_STATUS
     From    PS_JOB Jobs
     Inner join
           (SELECT EMPLID, MAX(EFFDT) EffDt FROM PS_JOB P Group By EMPLID) JobsMax
     On    Jobs.EmplId = JobsMax.EmplId  And
           Jobs.EffDt  = JobsMax.EffDt) B
On   A.EmplId = B.EmplId
Left outer join
     (Select  Taxes.EmplId
             ,Taxes.SWT_MAR_STATUS
             ,Taxes.EFFDT
             ,Taxes.EffSeq
      From    PS_STATE_TAX_DATA Taxes
      Inner join
              (SELECT EMPLID, MAX(EFFDT) EffDt FROM PS_STATE_TAX_DATA Group By EMPLID) TaxesMax
      On      Taxes.EmplId = TaxesMax.EmplId   And
              Taxes.EffDt  = TaxesMax.EffDt) D
On   A.EmplId = D.EmplId
Left outer join
     (Select Address.EmplId
            ,Address.EffDt
            ,Address.EffSeq
            ,Address.ADDRESS1
            ,Address.ADDRESS2
            ,Address.CITY
            ,Address.COUNTRY
            ,Address.POSTAL   
     From    PS_ADDRESSES Address
     Inner join
             (SELECT EMPLID, MAX(EFFDT)EffDt FROM PS_STATE_TAX_DATA Group By EMPLID) AddressMax
     On      Address.EmplId = AddressMax.EmplId   And
             Address.EffDt  = AddressMax.EffDt) E
On   A.EmplId = E.EmplId
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #4 (permalink)  
Antiguo 22/08/2007, 13:12
Avatar de zeusdelolimpo  
Fecha de Ingreso: agosto-2007
Mensajes: 54
Antigüedad: 16 años, 8 meses
Puntos: 0
De acuerdo Re: help me!!!

Muchas GRACIAS Adres95, todo estubo bien

Solo tube que hacerle unas modificaciones (ya que mi maquina si estan los nombres en mayusculas pues...) y quedo asi mira:

Código:
Select A.EMPLID
      ,A.LAST_NAME
      ,A.SECOND_LAST_NAME
      ,A.FIRST_NAME
      ,A.MIDDLE_NAME
      ,A.BIRTHDATE
      ,A.MAR_STATUS
      ,A.SEX
      --------------------
      ,B.EFFDT
      ,B.EFFSEQ
      ,B.HOURLY_RT
      ,B.CURRENCY_CD
      ,B.PAYGROUP
      ,B.COMPANY
      ,B.GL_PAY_TYPE
      ,B.[ACTION]
      ,B.ACTION_REASON
      ,B.EFFDT
      ,B.ANNUAL_RT
      ,B.DEPTID
      ,B.FLSA_STATUS
      --------------------
      ,isnull((Select Top 1 NATIONAL_ID_TYPE From PS_PERS_NID  Where  EMPLID = A.EMPLID),'')  AS NATIONAL_ID_TYPE
      --------------------
      ,D.EFFDT
      ,D.SWT_MAR_STATUS
      --------------------
      ,E.EFFDT
      ,E.ADDRESS1
      ,E.ADDRESS2
      ,E.CITY
      ,E.COUNTRY
      ,E.POSTAL
      --------------------
      ,isnull((Select Top 1 PHONE From PS_EMERGENCY_CNTCT  Where  EMPLID = A.EMPLID),'')  AS PHONE
From  PS_PERSONAL_DATA  A
Left outer join
     (Select Jobs.EMPLID
            ,Jobs.HOURLY_RT
            ,Jobs.CURRENCY_CD
            ,Jobs.PAYGROUP
            ,Jobs.COMPANY
            ,Jobs.GL_PAY_TYPE
            ,Jobs.ACTION
            ,Jobs.ACTION_REASON
            ,Jobs.EFFDT
            ,Jobs.EFFSEQ
            ,Jobs.ANNUAL_RT
            ,Jobs.DEPTID
            ,Jobs.FLSA_STATUS
     From    PS_JOB Jobs
     Inner join
           (SELECT EMPLID, MAX(EFFDT) EFFDT FROM PS_JOB P Group By EMPLID) JobsMax
     On    Jobs.EMPLID = JobsMax.EMPLID  And
           Jobs.EFFDT  = JobsMax.EFFDT) B
On   A.EMPLID = B.EMPLID
Left outer join
     (Select  Taxes.EMPLID
             ,Taxes.SWT_MAR_STATUS
             ,Taxes.EFFDT
      From    PS_STATE_TAX_DATA Taxes
      Inner join
              (SELECT EMPLID, MAX(EFFDT) EFFDT FROM PS_STATE_TAX_DATA Group By EMPLID) TaxesMax
      On      Taxes.EMPLID = TaxesMax.EMPLID   And
              Taxes.EFFDT  = TaxesMax.EFFDT) D
On   A.EMPLID = D.EMPLID
Left outer join
     (Select Address.EMPLID
            ,Address.EFFDT
            ,Address.ADDRESS1
            ,Address.ADDRESS2
            ,Address.CITY
            ,Address.COUNTRY
            ,Address.POSTAL   
     From    PS_ADDRESSES Address
     Inner join
             (SELECT EMPLID, MAX(EFFDT)EFFDT FROM PS_STATE_TAX_DATA Group By EMPLID) AddressMax
     On      Address.EMPLID = AddressMax.EMPLID   And
             Address.EFFDT  = AddressMax.EFFDT) E
On   A.EMPLID = E.EMPLID
Si te abras dado cuenta quite los campos que agregaste (gracias) "EFFDT" Y "EFFSEQ" por que en algunas de las tablas donde las agregaste no estaban y pues me sacaba un error...

Ahora, la tabla de PS_PERSONAL_DATA tiene 8028 registros y la consulta que tu me mandas (gracias) me manda 8410 registros por la siguiente razon:

Al mandar:

Código:
(SELECT EMPLID, MAX(EFFDT) EFFDT FROM PS_JOB P Group By EMPLID) JobsMax
     On    Jobs.EMPLID = JobsMax.EMPLID  And
           Jobs.EFFDT  = JobsMax.EFFDT
No me trae registros repetidos (exelente, gracias) pero solo tomando en cuenta "EFFDT" esto es si yo tengo una serie de registros asi:

EMPLID EFFDT

L00001 2004-01-23
L00001 2004-01-23
L00001 1995-01-22
L00001 1996-01-07
L00001 1996-02-02
L00001 1997-02-02
L00001 1998-02-01
L00001 2000-01-16

Me da esto:

EMPLID EFFDT

L00001 2004-01-23
L00001 2004-01-23

Por que los dos tienen la fecha maxima Pero hay otro campo que s puede utilizar como llave que es el de "EFFSEQ" yo supongo que puedo utilizar el mismo codigo que se utiliza para "EFFDT" masomenos asi

Código:
(SELECT EMPLID, MAX(EFFSEQ) EFFSEQ FROM PS_JOB P Group By EMPLID) JobsMax
     On    Jobs.EMPLID = JobsMax.EMPLID  And
           Jobs.EFFDT  = JobsMax.EFFSEQ)
por que tambien tiene un numero consecutivo la secuencia efectiva "EFFSEQ" si hay mas de una fecha efectiva "EFFDT" .

ojala me haya explicado con tanta tonteria y espero su respuesta MASTER

salu2
  #5 (permalink)  
Antiguo 22/08/2007, 15:10
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: help me!!!

¿La secuencia se reinicia cada dia?
¿Estas usando SQL Server 2000?

--------------------------------------------

Ok, suponiendo que se reinicia, solo faltaria agrupar el resultado y aplicarle un maximo a la secuencia de B quedando como sigue:


Código:
Select A.EMPLID
      ,A.LAST_NAME
      ,A.SECOND_LAST_NAME
      ,A.FIRST_NAME
      ,A.MIDDLE_NAME
      ,A.BIRTHDATE
      ,A.MAR_STATUS
      ,A.SEX
      --------------------
      ,B.EFFDT  JOB_EFFDT
      ,Max(B.EFFSEQ) EFFSEQ
      ,B.HOURLY_RT
      ,B.CURRENCY_CD
      ,B.PAYGROUP
      ,B.COMPANY
      ,B.GL_PAY_TYPE
      ,B.[ACTION]
      ,B.ACTION_REASON
      ,B.ANNUAL_RT
      ,B.DEPTID
      ,B.FLSA_STATUS
      --------------------
      ,isnull((Select Top 1 NATIONAL_ID_TYPE From PS_PERS_NID  Where  EMPLID = A.EMPLID),'')  AS NATIONAL_ID_TYPE
      --------------------
      ,D.EFFDT  TaXES_EFFDT
      ,D.SWT_MAR_STATUS
      --------------------
      ,E.EFFDT Address_Effdt
      ,E.ADDRESS1
      ,E.ADDRESS2
      ,E.CITY
      ,E.COUNTRY
      ,E.POSTAL
      --------------------
      ,isnull((Select Top 1 PHONE From PS_EMERGENCY_CNTCT  Where  EMPLID = A.EMPLID),'')  AS PHONE
From  PS_PERSONAL_DATA  A
Left outer join
     (Select Jobs.EMPLID
            ,Jobs.HOURLY_RT
            ,Jobs.CURRENCY_CD
            ,Jobs.PAYGROUP
            ,Jobs.COMPANY
            ,Jobs.GL_PAY_TYPE
            ,Jobs.ACTION
            ,Jobs.ACTION_REASON
            ,Jobs.EFFDT
            ,Jobs.EFFSEQ
            ,Jobs.ANNUAL_RT
            ,Jobs.DEPTID
            ,Jobs.FLSA_STATUS
     From    PS_JOB Jobs
     Inner join
           (SELECT EMPLID, MAX(EFFDT) EFFDT FROM PS_JOB P Group By EMPLID) JobsMax
     On    Jobs.EMPLID = JobsMax.EMPLID  And
           Jobs.EFFDT  = JobsMax.EFFDT) B
On   A.EMPLID = B.EMPLID
Left outer join
     (Select  Taxes.EMPLID
             ,Taxes.SWT_MAR_STATUS
             ,Taxes.EFFDT
      From    PS_STATE_TAX_DATA Taxes
      Inner join
              (SELECT EMPLID, MAX(EFFDT) EFFDT FROM PS_STATE_TAX_DATA Group By EMPLID) TaxesMax
      On      Taxes.EMPLID = TaxesMax.EMPLID   And
              Taxes.EFFDT  = TaxesMax.EFFDT) D
On   A.EMPLID = D.EMPLID
Left outer join
     (Select Address.EMPLID
            ,Address.EFFDT
            ,Address.ADDRESS1
            ,Address.ADDRESS2
            ,Address.CITY
            ,Address.COUNTRY
            ,Address.POSTAL   
     From    PS_ADDRESSES Address
     Inner join
             (SELECT EMPLID, MAX(EFFDT)EFFDT FROM PS_STATE_TAX_DATA Group By EMPLID) AddressMax
     On      Address.EMPLID = AddressMax.EMPLID   And
             Address.EFFDT  = AddressMax.EFFDT) E
On   A.EMPLID = E.EMPLID
Group by  A.EMPLID
         ,A.LAST_NAME
         ,A.SECOND_LAST_NAME
         ,A.FIRST_NAME
         ,A.MIDDLE_NAME
         ,A.BIRTHDATE
         ,A.MAR_STATUS
         ,A.SEX
         --------------------
         ,B.EFFDT
         ,B.HOURLY_RT
         ,B.CURRENCY_CD
         ,B.PAYGROUP
         ,B.COMPANY
         ,B.GL_PAY_TYPE
         ,B.[ACTION]
         ,B.ACTION_REASON
         ,B.ANNUAL_RT
         ,B.DEPTID
         ,B.FLSA_STATUS
         --------------------
         --------------------
         ,D.EFFDT
         ,D.SWT_MAR_STATUS
         --------------------
         ,E.EFFDT
         ,E.ADDRESS1
         ,E.ADDRESS2
         ,E.CITY
         ,E.COUNTRY
         ,E.POSTAL
         --------------------
Seria bueno revizar que los indices correctos esten presentes en las tablas que se estan consultando y que los Ids sean numericos, siendo asi no debes tener problemas con el tiempo de ejecución.

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.

Última edición por Andres95; 23/08/2007 a las 07:19 Razón: Agrupacion del resultado
  #6 (permalink)  
Antiguo 23/08/2007, 11:16
Avatar de zeusdelolimpo  
Fecha de Ingreso: agosto-2007
Mensajes: 54
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: help me!!!

Muchas garcias por seguir ayudandome Adres95.

No la Secuencia no se reinicia; has de cuenta que con la fecha efectiva le digo desde cuando quiero que sean validos los datos (pero como se nesesita guardar historial de eso no se puede borrar nada de ahi que hay mas de un registro por "EMPLID") pero a lo mejor el mismo "EMPLID" tiene 2 fechas efectivas iguales entonses de acuerdo al historial y basados en el "EFFSEQ" tomas el mas alto esto es si tenemos:

EMPLID EFFDT EFFSEQ

L00001 1997-02-02 00:00:00.000 01
L00001 1998-02-02 00:00:00.000 01
L00001 1998-02-02 00:00:00.000 02
L00001 1998-02-02 00:00:00.000 03

Este es el registro que me tendria que traer:

EMPLID EFFDT EFFSEQ

L00001 1998-02-02 00:00:00.000 03


Entonses se puede identificar de las fechas cual es la valida ok. espero haberme expliad


y Si estoy utilizando SQL server 2000, los ID son numericos , pero a que te refieres con que "los indices correctos esten en la tablas quue estoy consultando"

gracias por toda la yuda salu2
  #7 (permalink)  
Antiguo 23/08/2007, 12:59
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: help me!!!

Me referia a que las tablas deben estar indizadas para que la consulta sea mas rapida, si no estan indizadas las consultas se hacen muy lentas debido a que se recorren las tablas completan buscando los registros...

El anterior no te funcionó...?


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #8 (permalink)  
Antiguo 23/08/2007, 13:24
Avatar de zeusdelolimpo  
Fecha de Ingreso: agosto-2007
Mensajes: 54
Antigüedad: 16 años, 8 meses
Puntos: 0
De acuerdo Re: help me!!!

Cita:
Iniciado por Andres95 Ver Mensaje
Me referia a que las tablas deben estar indizadas para que la consulta sea mas rapida, si no estan indizadas las consultas se hacen muy lentas debido a que se recorren las tablas completan buscando los registros...

El anterior no te funcionó...?


Saludos!
Claro que funciono , pero me preguntaba que si lo mismo que hisiste con el EFFSEQ no lo podia haber hecho para el EFFDT (podia haber hecho he como si lo ubiera echo yo jiji) y para que la agrupacion ??

gracias nuevamente
salu2

A tambien yo imagino que esta linea:

Código:
,isnull((Select Top 1 PHONE From PS_EMERGENCY_CNTCT  Where  EMPLID = A.EMPLID),'')  AS PHONE
quiere decir que si no existe registro en la tabla PS_EMERGENCY_CNTCT donde EMPLID = A.EMPLID meta un '' toy bien o corrigame MASTER

Última edición por zeusdelolimpo; 23/08/2007 a las 13:31 Razón: otra pregunta
  #9 (permalink)  
Antiguo 23/08/2007, 14:16
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: help me!!!

Asi es...

Si la secuencia no se repite nunca por usuario, podria ser usada en lugar de la fecha.....

La agrupacion del ultimo ejemplo es para eliminar los repetidos con misma fecha y diferente secuencia....

ya es opcion tuya que utilices una u otra solucion, pruebalas en tu server y la que te resulte mejor, instalala...

Y lo del isnull asi es, es para cuando no se encuentre la informacion se regrese una cadena vacia...puedes hallar el detalle de la funcion en la ayuda de SQL Server...


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #10 (permalink)  
Antiguo 23/08/2007, 14:31
Avatar de zeusdelolimpo  
Fecha de Ingreso: agosto-2007
Mensajes: 54
Antigüedad: 16 años, 8 meses
Puntos: 0
De acuerdo Re: help me!!!

Jijole brother perdon!! MASTER (no debo hablarle de usted disculpe Sensei) todo me sirvio gracias sos usted un MASTER
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 15:17.