sql >> Base de Datos >  >> RDS >> Oracle

salida de dos consultas diferentes como un resultado en Oracle SQL

Hay dos formas de juntar las consultas:lateralmente usando uniones y una encima de otra con uniones. Al usar uniones, el resultado incluirá columnas de ambas consultas. Al usar uniones, el resultado incluirá filas de ambas consultas. Para que las uniones funcionen, ambas consultas deben devolver el mismo número de columnas correspondientes.

Supongo que desea agregar el recuento calculado en la segunda consulta como columna a la primera consulta. Esto funciona así (estoy usando el nuevo JOIN sintaxis):

SELECT
    q1.x, q1.y, q2.z, ...
FROM
    (SELECT ... FROM ...) q1
    LEFT JOIN
    (SELECT ... FROM ...) q2
        ON q1.column = q2.column

También puede usar INNER JOIN en lugar de LEFT JOIN si sabe que la consulta 2 produce al menos una fila para cada fila de la consulta 1 o si no está interesado en las filas de la consulta 1 donde faltan las filas correspondientes de la consulta 2.

SELECT 
    q1.message_type,
    q1.queue_seqnum,
    q1.files,
    q2.message_count
FROM (SELECT
         a.message_type,
         a.queue_seqnum,
         SUBSTR(b.char_data, 1, 2) files
      FROM
         ad_in_messageheader a,
         INNER JOIN ad_in_messagedetail b
            ON  a.queue_seqnum = b.queue_seqnum 
      WHERE
         a.message_type IN ('ERP_COSTS_SMRY', 'ERP_SALES_SMRY', 'ERP_SPEND_SMRY') AND
         a.create_time > '17-DEC-13 07.00.00 AM') q1
   LEFT JOIN
     (SELECT
         a.message_type,
         COUNT(a.message_type) message_count
      FROM
         ad_in_messageheader a 
      WHERE
         a.message_type IN ('ERP_COSTS', 'ERP_SALES', 'ERP_SPEND') AND
         create_time > '17-DEC-13 07.00.00 AM'
      GROUP BY
         a.message_type) q2
   ON q1.message_type = q2.message_type
ORDER BY
   q1.queue_seqnum DESC;

También haría la clasificación después de unir las dos subconsultas, porque el proceso de unión podría destruir cualquier orden establecido antes.

También hay un problema con los tipos de mensajes:no está seleccionando los mismos tipos de mensajes en las dos subconsultas. En ORACLE, puede usar el DECODE función para traducir los tipos de mensajes para que coincidan

En la subconsulta 1:

SELECT
    DECODE(a.message_type,
           'ERP_COSTS_SMRY', 'ERP_COSTS', 
           'ERP_SALES_SMRY', 'ERP_SALES',
           'ERP_SPEND_SMRY', 'ERP_SPEND') message_type

Si create_time es una DATE columna, debe convertir la cadena de fecha/hora en una fecha.

WHERE
    a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')

(Ver https://stackoverflow.com/a/10178346/880990 )

También use un año de cuatro dígitos si es posible. Esto es más seguro. es 31 1931 o 2031 ? Además, un número de mes también funcionará en sistemas con diferentes configuraciones regionales. DEC no sería reconocido en un sistema alemán. En lugar de DEZ se esperaría.