Има два начина за обединяване на заявки:настрани чрез използване на обединения и един върху друг с обединения. Когато използвате обединения, резултатът ще включва колони и от двете заявки. Когато използвате обединения, резултатът ще включва редове и от двете заявки. За да работят обединенията, и двете заявки трябва да върнат еднакъв брой съответстващи колони.
Предполагам, че искате да добавите броя, изчислен във втората заявка, като колона към първата заявка. Това работи по следния начин (използвам новия JOIN
синтаксис):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Можете също да използвате INNER JOIN
вместо LEFT JOIN
ако знаете, че query2 дава поне един ред за всеки ред от query1 или ако не се интересувате от редове от query1, където съответните редове липсват от 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;
Също така бих направил сортирането след съединяването на двете подзаявки, тъй като процесът на обединяване може да унищожи всеки установен преди това ред.
Има също проблем с типовете съобщения:не избирате едни и същи типове съобщения в двете подзаявки. В ORACLE можете да използвате DECODE
функция за превод на типовете съобщения, за да съвпаднат
В подзаявка 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Ако create_time
е DATE
колона, трябва да конвертирате низа за дата/час в дата.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(Вижте https://stackoverflow.com/a/10178346/880990 )
Използвайте и четирицифрена година, ако е възможно. Така е по-безопасно. Е 31
1931
или 2031
? Също така, номерът на месеца ще работи и на системи с различни локали. DEC
няма да се разпознае в немска система. Вместо DEZ
би се очаквало.