我有两个不同的表,我使用一些过滤器和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;
我已尝试UNION
和UNION ALL
两者。但那些不起作用。我也试过Select * from (query 1),(query 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_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
会被期待。
答案 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
。