none
Ayuda Query RRS feed

  • Pregunta

  • Hola soy nueva en este tema de SQL y recien estoy empezando a estudiar.

    Me gustaria me ayudaran a ordenar y estructurar una consulta

    Tengo esta tabla

    Select * from PCI_CapturaRevision

    IdObjeto fecha IdObjRevision IdObjEquipamiento IdObjAtributoRevision IdObjTecnico captura observaciones IdObjZona IdObjTipoEquipamiento CodigoRevision
    316 2020-07-01 00:00:00.000 NULL NULL NULL 52 0xFFD8FFE000104 Foto tomada desde el listado de Equipos 86 1025 PREV/20/00089
    317 2020-07-01 00:00:00.000 NULL NULL NULL 52 0xFFD8FFE000104 PREV/20/00089-Central1-DETECTORES Foto desde el listado 86 1025 PREV/20/00089
    318 2020-07-01 00:00:00.000 774 574 NULL 52 0xFFD8FFE000104 PREV/20/00089--Central1-DETECTORES-01 foto del Equipo NULL NULL
    319 2020-07-01 00:00:00.000 774 574 6796 52 0xFFD8FFE000104 PREV/20/00089--Central1-DETECTORES-01 Foto del atributo NULL NULL
    320 2020-07-01 00:00:00.000 774 574 6797 52 0xFFD8FFE000104 PREV/20/00089--Central1-DETECTORES-01 NULL NULL

    Basicamente esta tabla me almacena fotos y observaciones de unos trabajos

    Necesito estructurar la siquiente query para que me traiga todos esos datos pero como la tengo ahora solo me trae los dos primeros datos me ayudarian para saber que me falta

    SELECT CR.IdObjeto
    ,CR.IdObjRevision
    ,CR.IdObjEquipamiento
    ,CR.IdObjAtributoRevision
    ,CR.IdObjTecnico
    ,CR.captura
    ,CR.observaciones
    FROM PCI_CapturaRevision CR
    INNER JOIN PCI_AtributoRevision AR ON AR.idObjeto = CR.idObjAtributoRevision
    AND ISNULL(AR.idObjPeriodicidad, 0) IN (ISNULL(NULL, ISNULL(AR.idObjPeriodicidad, 0)))
    INNER JOIN PCI_Revision R ON R.idObjeto = CR.idObjRevision
    AND R.codigo = 'PREV/20/00089'
    INNER JOIN PCI_Equipamiento E ON CR.idObjEquipamiento = E.idObjeto
    miércoles, 29 de julio de 2020 20:09

Todas las respuestas

  • Cambia los INNER JOIN por LEFT JOIN.

    El problema casi seguro que está en alguna de las columnas que es NULL y por tanto no encuentra unión con alguna de las tablas mencionadas en el INNER JOIN, y al ser INNER entonces no se devuelve el registro que no tiene coincidencia.

    miércoles, 29 de julio de 2020 21:11
  • Buenas tardes.

    Sólo tus dos primeros datos cumplen con la condición = R.codigo = 'PREV/20/00089' si es que tus tablas tienen integridad entre ellas ese sería el motivo.

    Ahora si en la tabla PCI_Revision si están los datos a diferencia de la tabla PCI_CapturaRevision, algunos de los otros joins está realizando el filtro de los resultados. Para ello puedes ir inspeccionando cambiando por un LEFT JOIN  hasta ubicar el join que no se esta cumpliendo y en bade a la lógica del negocio hagas los ajustes.

    Te recomiendo trasladar al WHERE los filtros y dejar en los JOINS únicamente los enlaces.

    Ejemplo:

    ...

    INNER JOIN PCI_Revision R ON R.idObjeto = CR.idObjRevision AND R.codigo = CR.CodigoRevision

    WHERE R.codigo = 'PREV/20/00089'

    Espero te sirva

    Saludos


    Gracias Gaalsi

    miércoles, 29 de julio de 2020 21:28
  • Hola Jupeterespi:

    Prueba esto:

    SELECT 
     CR.IdObjeto
    ,CR.IdObjRevision
    ,CR.IdObjEquipamiento
    ,CR.IdObjAtributoRevision
    ,CR.IdObjTecnico
    ,CR.captura
    ,CR.observaciones
    FROM PCI_CapturaRevision CR LEFT JOIN PCI_AtributoRevision AR ON AR.idObjeto = CR.idObjAtributoRevision
    							LEFT JOIN PCI_Revision R ON R.idObjeto = CR.idObjRevision
    							LEFT JOIN PCI_Equipamiento E ON CR.idObjEquipamiento = E.idObjeto
    WHERE 
     (R.codigo = 'PREV/20/00089' OR R.CODIGO IS NULL)

    Probablemente el Where r.codigo puedas quitarle el r.codigo is null, pero sin saber de el esquema de tús datos es difícil predecir.

    Lo mejor en estos casos, es además, incluir alguna columna significativa en la select de los conjuntos e y Ar para ver los resultados.

    Si no utilizas Equipamiento ni Ar sólo tiene sentido, incluirlos, si quieres eliminar los registros de cr que no tengan revisiones o equipamientos. Si este fuese el caso entonces.

    SELECT 
     CR.IdObjeto
    ,CR.IdObjRevision
    ,CR.IdObjEquipamiento
    ,CR.IdObjAtributoRevision
    ,CR.IdObjTecnico
    ,CR.captura
    ,CR.observaciones
    FROM PCI_CapturaRevision CR inner JOIN PCI_AtributoRevision AR ON AR.idObjeto = CR.idObjAtributoRevision
    							inner JOIN PCI_Equipamiento E ON CR.idObjEquipamiento = E.idObjeto
    							LEFT JOIN PCI_Revision R ON R.idObjeto = CR.idObjRevision
    WHERE 
     (R.codigo = 'PREV/20/00089' OR R.CODIGO IS NULL)

    Left join sin perder registros

    https://javifer2.wordpress.com/2019/09/01/left-join-entender-la-combinacion-de-izquierda-y-no-perder-registros/

    jueves, 30 de julio de 2020 4:34