クエリをまとめるには、2つの方法があります。結合を使用して横向きにする方法と、ユニオンを使用して相互に重ね合わせる方法です。結合を使用すると、結果には両方のクエリの列が含まれます。ユニオンを使用すると、結果には両方のクエリの行が含まれます。ユニオンが機能するには、両方のクエリが同じ数の対応する列を返す必要があります。
2番目のクエリで計算されたカウントを列として最初のクエリに追加するとします。これは次のように機能します(新しい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の各行に対して少なくとも1つの行を生成することがわかっている場合、または対応する行がquery2から欠落しているquery1の行に関心がない場合。
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;
また、結合プロセスによって以前に確立された順序が破壊される可能性があるため、2つのサブクエリを結合した後に並べ替えを行います。
メッセージタイプにも問題があります。2つのサブクエリで同じメッセージタイプを選択していません。 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 を参照してください )
また、可能であれば4桁の年を使用してください。これはより安全です。 31
です 1931
または2031
?また、月番号は、ロケールが異なるシステムでも機能します。 DEC
ドイツのシステムでは認識されません。代わりにDEZ
期待されます。