ayuda con consulta
Publicado por fer (2 intervenciones) el 19/08/2011 14:59:14
estoy teniendo demasiados problemas para realizar una consulta
tengo 2 tablas:
usuarios ( ...., id_despacho)
despachos (id, ..., tipo, padre)
la jerarquia de despachos es la siguiente:
oficina (mas alto)
laboratorio
despacho (mas bajo)
estan todos en una tabla, la columna tipo indica lo que es (O, L, o D), y el padre quien tiene por encima. una oficina tiene varios laboratorios, y un laboratorio varios despachos, y cada hijo solo pertenece a un padre
por otra parte, un usuario puede estar asociado a un despacho, a un laboratorio o a una oficina
lo que busco es una consulta que me muestre un listado tal que:
usuario - oficina - laboratorio - despacho
pudiendo estar algunas columnas a null (en caso de que el usuario este asociado a una oficina o un laboratorio)
el problema esta en que al hacer las left joins con la tabla despachos, los usuarios que estan asociados a oficinas o laboratorios me los repite tantas veces como "hijos" tenga ese laboratorio y oficina (saca todas las combinaciones)
ahora mismo mi consulta esta asi:
select u.id, u.nombre, despacho.ofi_id, despacho.ofi_nom, despacho.lab_id, despacho.lab_nom, despacho.des_id, despacho.des_nom
from usuarios u
left join despachos aux ON aux.id = u.id_despacho
left join (
select o.id as ofi_id, o.nombre as ofi_nom, null as lab_id, null as lab_nom, null as des_id, null as des_nom from despachos o
where o.tipo = 'O'
union
select o.id as ofi_id, o.nombre as ofi_nom, l.id as lab_id, l.nombre as lab_nom, null as des_id, null as des_nom from despachos o
left join despachos l on l.padre = o.id and l.tipo = 'L'
where o.tipo = 'O'
union
select o.id as ofi_id, o.nombre as ofi_nom, l.id as lab_id, l.nombre as lab_nom, d.id as des_id, d.nombre as des_nom from despachos o
left join despachos l on l.padre = o.id and l.tipo = 'L'
left join despachos d on d.padre = l.id and d.tipo = 'D'
where o.tipo = 'O'
) as despacho on aux.id =
case
when aux.tipo = 'O' then o.id
when aux.tipo = 'L' then l.id
when aux.tipo = 'D' then d.id
end
where 1=1
espero que se entienda y podais ayudarme
tengo 2 tablas:
usuarios ( ...., id_despacho)
despachos (id, ..., tipo, padre)
la jerarquia de despachos es la siguiente:
oficina (mas alto)
laboratorio
despacho (mas bajo)
estan todos en una tabla, la columna tipo indica lo que es (O, L, o D), y el padre quien tiene por encima. una oficina tiene varios laboratorios, y un laboratorio varios despachos, y cada hijo solo pertenece a un padre
por otra parte, un usuario puede estar asociado a un despacho, a un laboratorio o a una oficina
lo que busco es una consulta que me muestre un listado tal que:
usuario - oficina - laboratorio - despacho
pudiendo estar algunas columnas a null (en caso de que el usuario este asociado a una oficina o un laboratorio)
el problema esta en que al hacer las left joins con la tabla despachos, los usuarios que estan asociados a oficinas o laboratorios me los repite tantas veces como "hijos" tenga ese laboratorio y oficina (saca todas las combinaciones)
ahora mismo mi consulta esta asi:
select u.id, u.nombre, despacho.ofi_id, despacho.ofi_nom, despacho.lab_id, despacho.lab_nom, despacho.des_id, despacho.des_nom
from usuarios u
left join despachos aux ON aux.id = u.id_despacho
left join (
select o.id as ofi_id, o.nombre as ofi_nom, null as lab_id, null as lab_nom, null as des_id, null as des_nom from despachos o
where o.tipo = 'O'
union
select o.id as ofi_id, o.nombre as ofi_nom, l.id as lab_id, l.nombre as lab_nom, null as des_id, null as des_nom from despachos o
left join despachos l on l.padre = o.id and l.tipo = 'L'
where o.tipo = 'O'
union
select o.id as ofi_id, o.nombre as ofi_nom, l.id as lab_id, l.nombre as lab_nom, d.id as des_id, d.nombre as des_nom from despachos o
left join despachos l on l.padre = o.id and l.tipo = 'L'
left join despachos d on d.padre = l.id and d.tipo = 'D'
where o.tipo = 'O'
) as despacho on aux.id =
case
when aux.tipo = 'O' then o.id
when aux.tipo = 'L' then l.id
when aux.tipo = 'D' then d.id
end
where 1=1
espero que se entienda y podais ayudarme
Valora esta pregunta
0