Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

saída de duas consultas diferentes como um resultado no Oracle SQL


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.