输出两个不同的查询作为oracle SQL的一个结果

时间:2013-12-17 14:01:39

标签: sql oracle

我有两个不同的表,我使用一些过滤器和SUM,COUNT,SUBSTR等聚合函数应用select查询。

我想在一个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),但它也没有用。请建议我一些在这种情况下有用的解决方案。感谢。

2 个答案:

答案 0 :(得分:20)

将查询放在一起有两种方法:通过使用联接来横向移动,并使用联合在一起。使用联接时,结果将包括两个查询的列。使用联合时,结果将包括两个查询的行。要使联合工作,两个查询都必须返回相同数量的相应列。

我假设您要将第二个查询中计算的计数添加为第一个查询的列。这是这样的(我使用新的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中缺少相应行的行不感兴趣,您也可以使用INNER JOIN而不是LEFT JOIN 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_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 1931还是2031?此外,月份编号也适用于具有不同区域设置的系统。 DEC在德国系统中不会被识别。相反,DEZ会被期待。

答案 1 :(得分:5)

如果您使用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