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.