我有两个不同的表,我在其中应用选择查询与一些过滤器和聚合函数,如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)
我曾尝试UNION和UNION 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_time是DATE列,则必须将日期/时间字符串转换为日期.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)
如果可能,也使用四位数年份.这更安全.是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
Run Code Online (Sandbox Code Playgroud)
order by结合两个查询后你必须使用finally ..
| 归档时间: |
|
| 查看次数: |
82368 次 |
| 最近记录: |