簡體   English   中英

輸出兩個不同的查詢作為oracle SQL的一個結果

[英]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;

我已經嘗試了UNIONUNION 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_timeDATE列,則必須將日期/時間字符串轉換為日期。

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 19312031 此外,月份編號也適用於具有不同區域設置的系統。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM