Oracle
 sql >> Base de données >  >> RDS >> Oracle

sortie de deux requêtes différentes en un seul résultat dans oracle SQL

Il existe deux manières de regrouper les requêtes :latéralement en utilisant des jointures et les unes sur les autres avec des unions. Lors de l'utilisation de jointures, le résultat inclura les colonnes des deux requêtes. Lors de l'utilisation d'unions, le résultat inclura les lignes des deux requêtes. Pour que les unions fonctionnent, les deux requêtes doivent renvoyer le même nombre de colonnes correspondantes.

Je suppose que vous souhaitez ajouter le nombre calculé dans la deuxième requête en tant que colonne à la première requête. Cela fonctionne comme ceci (j'utilise le nouveau JOIN syntaxe):

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

Vous pouvez également utiliser INNER JOIN au lieu de LEFT JOIN si vous savez que query2 génère au moins une ligne pour chaque ligne de query1 ou si vous n'êtes pas intéressé par les lignes de query1 où les lignes correspondantes sont manquantes dans 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;

Je ferais également le tri après avoir joint les deux sous-requêtes, car le processus de jointure pourrait détruire tout ordre établi auparavant.

Il y a aussi un problème avec les types de message :vous ne sélectionnez pas les mêmes types de message dans les deux sous-requêtes. Dans ORACLE, vous pouvez utiliser le DECODE fonction pour traduire les types de messages pour les faire correspondre

Dans la sous-requête 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 est une DATE colonne, vous devez convertir la chaîne date/heure en date.

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

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

Utilisez également une année à quatre chiffres si possible. C'est plus sûr. Est 31 1931 ou 2031 ? De plus, un numéro de mois fonctionnera également sur des systèmes avec des paramètres régionaux différents. DEC ne serait pas reconnu sur un système allemand. Au lieu de cela DEZ serait attendu.