回答

收藏

在Oracle SQL将两个不同查询的输出作为结果

技术问答 技术问答 294 人阅读 | 0 人回复 | 2023-09-14

我有两个不同的表,我用了一些过滤器和汇总函数(比如SUM,COUNT,SUBSTR)选择查询。
. k9 s" l0 E4 u5 E. F, W我想在单个结果中获得这两个不同的输出。, z6 \7 g8 i! M, v: J
查询1:
& j- B4 o! d4 l1 qSELECT    a.message_type,   a.queue_seqnum,   b.queue_seqnum,   SUBSTR(b.char_data,1,2) filesFROM    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:
' [* C) a% Z7 ]" w9 w5 ?2 c% |SELECT    a.message_type,   count(a.message_type) countFROM    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),(query2),但也没用。请给我一些解决方案,在这种情况下会有帮助。谢谢你。6 Z# L4 K8 c9 @% \8 F: s$ V! r; S" R
                                                                % D; j! X7 W- X
    解决方案:                                                               
! D5 B& Y( R# y( a                                                                将查询放在一起有两种方法:使用连接进行侧向查询,并相互联合查询。使用连接时,结果将包括两个查询列。使用联合时,结果将包括两个查询行。为了使联合工作,两个查询必须返回相同数量的相应列。
' w: w9 R' p7 L- Y我假设你想把第二个查询中计算的计数作为列添加到第一个查询中。这是这样的(我用新的JOIN语法):, U6 Y8 y4 G) a. R
SELECT    q1.x,q1.y,q2.z,...FROM    (SELECT ... FROM ...) q1    LEFT JOIN    (SELECT ... FROM ...) q2          ON q1.column = q2.column如果您知道query2为query每行至少产生一行,或者你对query1的行(其中query2缺乏相应的行)不感兴趣,也可以使用INNERJOIN代替LEFT JOIN。
! y# s2 M4 d0 I0 ~& X/ [0 eSELECT     q1.message_type,   q1.queue_seqnum,   q1.files,   q2.message_countFROM (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_typeORDER BY   q1.queue_seqnum DESC;连接两个子查询后,由于连接过程可能会破坏之前建立的任何顺序,我也会进行排序。
* G& d/ @/ C3 i5 X0 r' c4 i新闻类型也有一个问题:你不会在两个子查询中选择相同的新闻类型。ORACLE你可以用这个DECODE功能翻译信息类型匹配! ?) i; ^, \: C
子查询1:6 }$ ^/ {& V! M7 D% C, l! F# D: c9 i
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日期/时间字符串必须转换为日期。! f( T+ n8 U3 i4 M% r
WHERE    a.create_time > TO_DATE('17-12-DD-MM-YYYY HH24:MI:SS')如有可能,请使用四位数年份。这样更安全。
) w2 N( U: p+ v* K8 ~) [0 b1931还是2031?同样,在不同地区设置的系统设置的系统上工作。DEC德国系统不会被认可。DEZ是预期。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则