0

buena noche. Tengo una cuestión con una consulta que debe conectar varias veces la misma tabla a si misma, la tabla tiene los siguientes campos:

enter image description here

Y lo que quiero obtener es lo siguiente:

enter image description here

Para obtener los datos del Proyecto y del Folder se hace mediante G_PRJID Y G_FOLID

Ya intente con la siguiente consulta:

Select f.g_prjid id_proyecto ,gf.g_objname as Proyecto , f.g_folid id_folder ,g.g_objname as Folder, f.g_objid as id_objeto,o.g_obtname as tipo_objeto,f.g_objname as objeto, f.g_objdtcreation as fecha_creacion, f.g_objusrcreation as usuario_creacion,
case f.g_objstatus
when 1 then 'Valid'
when 2 then 'Invalid'
when 4 then 'Undefinied'
else 'Otro'
END as Estatus
from g_fat f
left join g_object_type o on f.g_objtype =  o.g_objtype
LEFT  JOIN G_FAT G ON G.G_OBJID = F.G_FOLID
LEFT  JOIN G_FAT GF ON GF.G_OBJID = F.G_PRJID;

Pero me repite datos por id ya que varios objetos pueden tener el mismo id, esperaria alguien pueda ayudarme a solucionar esta consulta. introducir la descripción de la imagen aquí

KOH
  • 1
  • Pruebe con `INNER JOIN` en lugar de `LEFT JOIN`. Si le funciona puede ampliar su conocimiento con https://es.stackoverflow.com/questions/36/cu%C3%A1l-es-la-diferencia-entre-un-inner-y-un-outer-join https://es.m.wikipedia.org/wiki/Sentencia_JOIN_en_SQL – Mauricio Ortega Mar 27 '22 at 15:49
  • Has probado con `CONNECT BY`? – Luis Cazares Mar 28 '22 at 15:01
  • Puede agregar una cuantos registros de ejemplo y cómo con esos datos espera que sea la salida esperada? – alvalongo Apr 08 '22 at 01:27

1 Answers1

0

Usa identificadores de tablas y consulta los datos "recursivos" mediante sub-consultas. Una subconsulta te permitirá retornar un valor y fila única para agregarlo como una nueva columna dentro de tu consulta "padre", pudiendo filtrar la subconsulta con valores de la consulta "padre".

Ejemplo referencial

   users

id    nombre    edad 
1     cesar     26
2     juan      11
3     pedro     23

uso de la subconsulta

select 
    id, 
    nombre, 
    (
        select 
            edad 
        from 
            users as users_subquery 
        where 
            users_subquery.id = users_parent.id
    )as subquery_edad 
from 
    users as users_parent

Lo anterior retornará

id    nombre    subquery_edad 
1     cesar     26
2     juan      11
3     pedro     23

El ejemplo anterior es bastante ordinario y sin mayor sentido, pero sencillo para entender como hacer una subconsulta.

Dentro de una sub-consulta puedes consultar vistas, aplicar condiciones, usar case-when, funciones de agregación, entre otras cosas. Personalmente creo que son la mejor forma de simplificar consultas complejas entre la misma u otras tablas.

Soy César Mora
  • 2,165
  • 3
  • 10
  • 30
  • Muchísimas gracias, lo he intentado con subconsulta Primero la hice con datos definidos para ver que funcionara pero al pasarle el parámetro que quiero que condicione de la consulta me marca que la subquery arroja mas de una fila. – KOH Mar 27 '22 at 03:09
  • Eso depende del resultado esperado. La subconsulta solo debe retornar una fila y valor único para ser agregado en la columna de la consulta padre. ¿Estás filtrando adecuadamente? Si una fila está repetida esta debiera aparecer en la "consulta padre". Si aún así necesitas todos los valores de la subconsulta (recuerda que generas un valor para una columna, no otro set de datos) puedes revisar las funciones de agrupación que provee el motor de DB. Por ejemplo en MYSQL puedes usar ````GROUP_CONCAT()```` que permite combinar una columna de N filas en un string separado por un identificador definido – Soy César Mora Mar 27 '22 at 13:55