두 개의 서로 다른 쿼리를 하나의 결과로 오라클 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 JOIN
query2가 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
'programing' 카테고리의 다른 글
MySQL InnoDB: 'FOR UPDATE'와 'LOCK IN SHARE MODE'의 차이점 (0) | 2023.07.23 |
---|---|
MariaDB의 IN 문에 잘못된 결과가 있습니까? (0) | 2023.07.23 |
다른 컴파일러에서 MSVC의 _count of와 동등합니까? (0) | 2023.07.23 |
pip/easy_install 없이 pypi 모듈을 수동으로 설치하는 방법은 무엇입니까? (0) | 2023.07.23 |
char[]는 스택에 있지만 char *는 힙에 있는 이유는 무엇입니까? (0) | 2023.07.23 |