programing

두 개의 서로 다른 쿼리를 하나의 결과로 오라클 SQL로 출력

javajsp 2023. 7. 23. 14:02

두 개의 서로 다른 쿼리를 하나의 결과로 오라클 SQL로 출력

나는 SUM, COUNT, SUBSTR과 같은 일부 필터와 집계 함수를 사용하여 선택 쿼리를 적용하는 두 개의 다른 테이블을 가지고 있습니다.

이 두 가지 다른 출력을 단일 결과로 얻고자 합니다. 예:

쿼리 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)그러나 그것은 또한 효과가 없었습니다.이 시나리오에서 도움이 될 해결책을 제안해주세요.감사해요.

쿼리를 함께 배치하는 두 가지 방법이 있습니다. 조인을 사용하여 옆으로 배치하는 방법과 유니언을 사용하여 서로 위에 배치하는 방법입니다.조인을 사용하면 결과에 두 쿼리의 열이 모두 포함됩니다.유니언을 사용할 경우 결과에는 두 쿼리 행이 모두 포함됩니다.유니언이 작동하려면 두 쿼리 모두 해당 열 수를 동일하게 반환해야 합니다.

두 번째 쿼리에서 계산된 카운트를 첫 번째 쿼리에 열로 추가하려고 합니다.이렇게 작동합니다(새 제품을 사용하고 있습니다).JOIN구문):

SELECT
    q1.x, q1.y, q2.z, ...
FROM
    (SELECT ... FROM ...) q1
    LEFT JOIN
    (SELECT ... FROM ...) q2
        ON q1.column = q2.column

사용할 수도 있습니다.INNER JOIN대신에LEFT JOINquery2가 query1의 각 행에 대해 적어도 하나의 행을 생성한다는 것을 알고 있거나 query2에서 해당 행이 누락된 query1의 행에 관심이 없는 경우.

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예상할 수 있습니다.

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마지막으로 두 쿼리를 결합한 후에..

언급URL : https://stackoverflow.com/questions/20636192/output-of-two-different-queries-as-one-result-in-oracle-sql