Oracle如何做外联行选择

时间:2018-09-17 11:08:16

标签: oracle

我有3个选择

 SELECT
        mam.fecha                                                              fecha
      , u.COD_USUARIO                                                          usuario
      , u.NOMBREAPELLIDOS                                                      nombre                                                      
      , ROW_NUMBER() OVER (PARTITION BY u.cod_usuario ORDER BY mam.fecha ASC)  AS rn_asc
      , ROW_NUMBER() OVER (PARTITION BY u.cod_usuario ORDER BY mam.fecha DESC) AS rn_desc
      ,mam.accion   accion

      ,u.ID_CENTRO_GESTION centrogestion 
    FROM r_mod_asignar_material mam
    INNER JOIN r_usuarios u ON mam.cod_usuario = u.cod_usuario

    where  mam.ACCION = 'A'

    and trunc(mam.fecha) = to_date('13/09/2018','dd/mm/yyyy')
   and mam.cod_usuario = '9717703'
   and u.id_centro_gestion = '3'
   order by u.cod_usuario

第二,更改位置相同

SELECT
        mam.fecha                                                              fecha
      , u.COD_USUARIO                                                          usuario
      , u.NOMBREAPELLIDOS                                                      nombre                                                      
      , ROW_NUMBER() OVER (PARTITION BY u.cod_usuario ORDER BY mam.fecha ASC)  AS rn_asc
      , ROW_NUMBER() OVER (PARTITION BY u.cod_usuario ORDER BY mam.fecha DESC) AS rn_desc
      ,mam.accion   accion

      ,u.ID_CENTRO_GESTION centrogestion 
    FROM r_mod_asignar_material mam
    INNER JOIN r_usuarios u ON mam.cod_usuario = u.cod_usuario

    where  mam.ACCION = 'D'

    and trunc(mam.fecha) = to_date('13/09/2018','dd/mm/yyyy')
   and mam.cod_usuario = '9717703'
   and u.id_centro_gestion = '3'
   order by u.cod_usuario

第三个

SELECT   COUNT (*) numeroincidencias, ri.cod_usuario usuario
            FROM r_incidencias ri
           WHERE TRUNC (ri.fecha_inc) = TO_DATE ('13/09/2018', 'dd/mm/yyyy')
           and ri.cod_usuario = '9717703'
        GROUP BY ri.cod_usuario

我想通过cod_usuario链接这些选择。第一次,第二次或第三次选择中不能有行。

如何进行这些选择的外部联接?

1 个答案:

答案 0 :(得分:1)

让每个选择的对象都使用一个公共表表达式,然后将它们全部外部连接在一起:

WITH cte1 AS (SELECT mam.fecha AS fecha,
                     u.COD_USUARIO AS usuario,
                     u.NOMBREAPELLIDOS AS nombre,
                     ROW_NUMBER() OVER (PARTITION BY u.cod_usuario
                                        ORDER BY mam.fecha ASC) AS rn_asc,
                     ROW_NUMBER() OVER (PARTITION BY u.cod_usuario
                                        ORDER BY mam.fecha DESC) AS rn_desc,
                     mam.accion AS accion,
                     u.ID_CENTRO_GESTION AS centrogestion 
                FROM r_mod_asignar_material mam
                INNER JOIN r_usuarios u
                  ON mam.cod_usuario = u.cod_usuario
                where mam.ACCION = 'A' and
                      trunc(mam.fecha) = to_date('13/09/2018','dd/mm/yyyy') AND
                      mam.cod_usuario = '9717703' AND
                      u.id_centro_gestion = '3'
                order by u.cod_usuario),
     cte2 AS (SELECT mam.fecha AS fecha,
                     u.COD_USUARIO AS usuario,
                     u.NOMBREAPELLIDOS AS nombre,
                     ROW_NUMBER() OVER (PARTITION BY u.cod_usuario
                                        ORDER BY mam.fecha ASC) AS rn_asc,
                     ROW_NUMBER() OVER (PARTITION BY u.cod_usuario
                                        ORDER BY mam.fecha DESC) AS rn_desc,
                     mam.accion AS accion
                     u.ID_CENTRO_GESTION AS centrogestion 
                FROM r_mod_asignar_material mam
                INNER JOIN r_usuarios u
                  ON mam.cod_usuario = u.cod_usuario
                where mam.ACCION = 'D' and
                      trunc(mam.fecha) = to_date('13/09/2018','dd/mm/yyyy') AND
                      mam.cod_usuario = '9717703' AND
                      u.id_centro_gestion = '3'
                order by u.cod_usuario),
     cte3 AS (SELECT COUNT (*) numeroincidencias,
                     ri.cod_usuario usuario
                FROM r_incidencias ri
                WHERE TRUNC (ri.fecha_inc) = TO_DATE ('13/09/2018', 'dd/mm/yyyy') AND
                      ri.cod_usuario = '9717703'
                GROUP BY ri.cod_usuario)
SELECT *
  FROM cte1
  FULL OUTER JOIN cte2
    ON cte2.cod_usuario = cte1.cod_usuario
  FULL OUTER JOIN cte3
    ON cte3.cod_usuario = COALESCE(cte1.cod_usuario, cte2.cod_usuario)