Problemas con inner join
Publicado por Gabriel Fabres (2 intervenciones) el 30/07/2008 15:55:34
Hola a todos.
tengo el siguiente problema con una consulta.
tengo el siguiente select
select mo.name,
us.usunom + ' ' + us.usuapepat as nombre_usuario,
ci.ciades as compañia,
lo.locdes as localidad,
ar.aredes as division,
cc.ccocod as centro_Costo
from modacc mo with (noLock) -- tabla con detalle
inner join usutab us on mo.name = us.name --tabla con nombres de usuario
inner join ciatab ci on mo.ciacod = ci.ciacod -- tabla con nombres de compañias
inner join loctab lo on mo.loccod = lo.loccod -- tabla con nombre de locales
inner join aretab ar on mo.divcod = ar.arecod -- tabla con nombres de divisiones
inner join ccotab cc on mo.ccocod = cc.ccocod tabla con nombres de centros de costo
where mo.name = 'qfybarra' -- usuario seleccionado
and mo.oricod = '018' -- origen de la compañia que consulta
and mo.modcod = 'WEB' -- tipo de modulo a consultar
en donde la tabla llamada modacc contiene mas de 80.000 registros con accesos de clientes a modulos de la intranet, y las tablas usutab, ciatab, loctab, aretab, y ccotab, datos especificos de usuarios, compañias, areas, locales y centros de costo respectivamente.
el problema se da en que al hacer el siguiente select de un usuario cualquiera
select * from modacc mo
where mo.name = 'qfybarra'
and mo.oricod = '018'
and mo.modcod = 'WEB'
me aparecen 2 registros (lo cual esta correcto), segun el criterio del where.
pero al hacer el mismo select usando los inner joins del comienzo, la consulta se demora varias horas, y genera miles de registros, cuando solo deberia entregar 2 registros con los datos solicitados.
como dato adicional, les puedo comentar que lamentablemente las tablas estan mal diseñadas, ya que todos los nombres de campos involucrados en esta consulta son del tipo varchar(XX), y esto no lo puedo cambiar (aun), y ademas de eso, existe mucha informacion en las tablas que esta mal (años de acumular registros)
De antemano ,muchas gracias por sus sugerencias
Saludos Cordiales.
Gabriel
tengo el siguiente problema con una consulta.
tengo el siguiente select
select mo.name,
us.usunom + ' ' + us.usuapepat as nombre_usuario,
ci.ciades as compañia,
lo.locdes as localidad,
ar.aredes as division,
cc.ccocod as centro_Costo
from modacc mo with (noLock) -- tabla con detalle
inner join usutab us on mo.name = us.name --tabla con nombres de usuario
inner join ciatab ci on mo.ciacod = ci.ciacod -- tabla con nombres de compañias
inner join loctab lo on mo.loccod = lo.loccod -- tabla con nombre de locales
inner join aretab ar on mo.divcod = ar.arecod -- tabla con nombres de divisiones
inner join ccotab cc on mo.ccocod = cc.ccocod tabla con nombres de centros de costo
where mo.name = 'qfybarra' -- usuario seleccionado
and mo.oricod = '018' -- origen de la compañia que consulta
and mo.modcod = 'WEB' -- tipo de modulo a consultar
en donde la tabla llamada modacc contiene mas de 80.000 registros con accesos de clientes a modulos de la intranet, y las tablas usutab, ciatab, loctab, aretab, y ccotab, datos especificos de usuarios, compañias, areas, locales y centros de costo respectivamente.
el problema se da en que al hacer el siguiente select de un usuario cualquiera
select * from modacc mo
where mo.name = 'qfybarra'
and mo.oricod = '018'
and mo.modcod = 'WEB'
me aparecen 2 registros (lo cual esta correcto), segun el criterio del where.
pero al hacer el mismo select usando los inner joins del comienzo, la consulta se demora varias horas, y genera miles de registros, cuando solo deberia entregar 2 registros con los datos solicitados.
como dato adicional, les puedo comentar que lamentablemente las tablas estan mal diseñadas, ya que todos los nombres de campos involucrados en esta consulta son del tipo varchar(XX), y esto no lo puedo cambiar (aun), y ademas de eso, existe mucha informacion en las tablas que esta mal (años de acumular registros)
De antemano ,muchas gracias por sus sugerencias
Saludos Cordiales.
Gabriel
Valora esta pregunta


0