Há duas maneiras de reunir consultas:Lateralmente usando junções e umas sobre as outras com uniões. Ao usar junções, o resultado incluirá colunas de ambas as consultas. Ao usar uniões, o resultado incluirá linhas de ambas as consultas. Para que os sindicatos funcionem, ambas as consultas devem retornar o mesmo número de colunas correspondentes.
Suponho que você queira adicionar a contagem calculada na segunda consulta como coluna da primeira consulta. Isso funciona assim (estou usando o novo
JOIN
sintaxe):SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Você também pode usar
INNER JOIN
em vez de LEFT JOIN
se você souber que query2 produz pelo menos uma linha para cada linha de query1 ou se não estiver interessado em linhas de query1 onde as linhas correspondentes estão faltando em query2. 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;
Eu também faria a ordenação após juntar as duas subconsultas, pois o processo de junção poderia destruir qualquer ordem estabelecida anteriormente.
Há também um problema com os tipos de mensagem:Você não está selecionando os mesmos tipos de mensagem nas duas subconsultas. No ORACLE, você pode usar o
DECODE
função para traduzir os tipos de mensagem para torná-los correspondentes Na subconsulta 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Se
create_time
é uma DATE
coluna, você deve converter a string de data/hora em uma data. WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(Consulte https://stackoverflow.com/a/10178346/880990 )
Use também um ano de quatro dígitos, se possível. Isso é mais seguro. É
31
1931
ou 2031
? Além disso, um número de mês também funcionará em sistemas com diferentes localidades. DEC
não seria reconhecido em um sistema alemão. Em vez disso, DEZ
Seria esperado.