将多个查询组合成单个查询

时间:2014-02-11 13:54:30

标签: oracle11g

我有2次查询并且调用了2次函数我需要根据msg_sys_no计数和msg_trans_type调用该函数一次。 请找到下面提到的查询,并为我提供合并为单一的解决方案。

SELECT COUNT(DISTINCT b1.msg_sys_no) INTO A
    FROM tra_message b1
    WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date
    AND b1.msg_service_provider                   = in_svc_provider
    AND b1.msg_trans_type = 'TRADE1'
    AND get_transaction_status_func(b1.msg_sys_no, b1.msg_trans_type) = 'S';

SELECT COUNT(DISTINCT b1.msg_sys_no) INTO B
    FROM tra_message b1
    WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date
    AND b1.msg_service_provider                   = in_svc_provider
    AND b1.msg_trans_type = 'TRADE2'
    AND get_transaction_status_func(b1.msg_sys_no, b1.msg_trans_type) = 'S';

2 个答案:

答案 0 :(得分:0)

这样的事情:

WITH tra_data
     AS (SELECT *
           FROM tra_message
          WHERE TO_CHAR (msg_when_created, 'YYYY-MM-DD') = in_start_date
                AND msg_service_provider = in_svc_provider
                AND get_transaction_status_func (msg_sys_no, msg_trans_type) =
                       'S')
SELECT COUNT (*)
  FROM tra_data
 WHERE msg_trans_type = 'TRADE1'
UNION
SELECT COUNT (*)
  FROM tra_data
 WHERE msg_trans_type = 'TRADE2'

答案 1 :(得分:0)

问题是您的AND b1.msg_trans_type IN('TRADE1','TRADE2')条件。

尝试这样的事情:

select COUNT(DISTINCT a) TRADE1,
       COUNT(DISTINCT b) TRADE2
into A,B
from (
select case when b1.msg_trans_type = 'TRADE1'
            then b1.msg_sys_no
            else null end as a,
       case when b1.msg_trans_type = 'TRADE2'
            then b1.msg_sys_no
            else null end as b
FROM tra_message b1 
WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date
AND b1.msg_service_provider = in_svc_provider
AND b1.msg_trans_type IN ('TRADE1','TRADE2')
AND get_transaction_status_func(b1.msg_sys_no, b1.msg_trans_type) = 'S'
);