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.