[英]output of two different queries as one result in oracle SQL
我有兩個不同的表,我在其中應用選擇查詢與一些過濾器和聚合函數,如SUM,COUNT,SUBSTR。
我想在一個result.example中得到這兩個不同的輸出:
查詢1:
SELECT
a.message_type,
a.queue_seqnum,
b.queue_seqnum,
SUBSTR(b.char_data,1,2) files
FROM
ad_in_messageheader a,
ad_in_messagedetail b
WHERE
a.queue_seqnum = b.queue_seqnum AND
a.MESSAGE_TYPE IN ('ERP_COSTS_SMRY','ERP_SALES_SMRY','ERP_SPEND_SMRY') AND
a.create_time > '17-DEC-13 07.00.00 AM'
ORDER BY
a.queue_seqnum desc;
查詢2:
SELECT
a.message_type,
count(a.message_type) 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;
我已經嘗試了UNION
和UNION ALL
。 但那些不起作用。 我也嘗試Select * from (query 1),(query 2)
,但它也沒有用。 請建議我一些在這種情況下有用的解決方案。 謝謝。
有兩種方法可以將查詢放在一起:通過使用連接來橫向連接,並使用聯合連接在一起。 使用聯接時,結果將包括兩個查詢的列。 使用聯合時,結果將包括兩個查詢的行。 要使聯合工作,兩個查詢都必須返回相同數量的相應列。
我假設您要將第二個查詢中計算的計數作為列添加到第一個查詢。 這樣工作(我正在使用新的JOIN
語法):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
如果您知道query2為query1的每一行產生至少一行,或者如果您對query1中查詢2中缺少相應行的行不感興趣,也可以使用INNER JOIN
而不是LEFT JOIN
。
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
是預期的。
如果使用union或union all來組合多個查詢,則每個查詢應具有相同數量的具有相同數據類型的列。
使用以下查詢:
SELECT a.message_type,a.queue_seqnum, b.queue_seqnum,SUBSTR (b.char_data,1,2)
files,0 as count FROM ad_in_messageheader a, ad_in_messagedetail b WHERE a.queue_seqnum =
b.queue_seqnum AND a.MESSAGE_TYPE in
('ERP_COSTS_SMRY','ERP_SALES_SMRY','ERP_SPEND_SMRY') AND
a.create_time > '17-DEC-13 07.00.00 AM'
union all
SELECT a.message_type,'' as queue_seqnum,'' as queue_seqnum, '' as files
count(a.message_type) 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
並且在結合兩個查詢之后你必須最終使用order by
..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.