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

Him*_*710 12 sql oracle

我有两个不同的表,我在其中应用选择查询与一些过滤器和聚合函数,如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;
Run Code Online (Sandbox Code Playgroud)

查询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;
Run Code Online (Sandbox Code Playgroud)

我曾尝试UNIONUNION ALL两者.但那些不起作用.我也尝试过Select * from (query 1),(query 2),但它也没有用.请建议我一些在这种情况下有用的解决方案.谢谢.

Oli*_*bes 22

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

我假设您要将第二个查询中计算的计数作为列添加到第一个查询.这样工作(我正在使用新JOIN语法):

SELECT
    q1.x, q1.y, q2.z, ...
FROM
    (SELECT ... FROM ...) q1
    LEFT JOIN
    (SELECT ... FROM ...) q2
        ON q1.column = q2.column
Run Code Online (Sandbox Code Playgroud)

您还可以使用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;
Run Code Online (Sandbox Code Playgroud)

我也会在加入两个子查询后进行排序,因为加入过程可能会破坏之前建立的任何订单.

消息类型也存在问题:您没有在两个子查询中选择相同的消息类型.在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
Run Code Online (Sandbox Code Playgroud)

如果create_timeDATE列,则必须将日期/时间字符串转换为日期.

WHERE
    a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

(参见/sf/answers/712484251/)

如果可能,也使用四位数年份.这更安全.是31 19312031?此外,月份编号也适用于具有不同区域设置的系统.DEC不会在德国系统上被认可.相反DEZ可以预料.


Haj*_*aji 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
Run Code Online (Sandbox Code Playgroud)

order by结合两个查询后你必须使用finally ..