티스토리 뷰
주된 문제는 대부분의 하위 쿼리가 날짜의 어색한 것을 포함하여 검색 기준에 대한 기능을 사용한다는 것입니다. 실제 날짜를 제공하여 예상 범위를 뒤집고 명시 적으로 한정하는 것이 훨씬 낫습니다 (한 달 범위는 일반적으로 총 행의 작은 비율이므로 인덱스에 도달 할 가능성이 매우 높습니다).
SELECT Chart.levelP, Chart.code, Chart.descP,
COALESCE(GL_SUM.ocf, 0),
COALESCE(Transactions.bcf, 0),
COALESCE(Transactions.debit, 0),
COALESCE(Transactions.credit, 0),
FROM ca_ChartAcc Chart
LEFT JOIN (SELECT code, SUM(amount) AS ocf
FROM ca_GLOpen
WHERE acc_mth = '2016') GL_Sum
ON GL_Sum.code = Chart.code
LEFT JOIN (SELECT code,
SUM(amount) AS bcf,
SUM(CASE WHEN amount > 0 THEN amount) AS debit,
SUM(CASE WHEN amount < 0 THEN amount) AS credit,
FROM ca_GLMainTrx
WHERE doc_date >= TO_DATE('2016-01-01')
AND doc_date < TO_DATE('2016-02-01')) Transactions
ON Transactions.code = Chart.code
WHERE Chart.code IS NOT NULL
ORDER BY TO_NUMBER(Chart.code), TO_NUMBER(Chart.levelP)
코드가 몇 개만 필요한 경우 해당 값을 하위 쿼리로 푸시하는 것이 더 나은 결과를 얻을 수 있습니다 (최적화 프로그램이이를 수행 할 가능성이 있음). 절 에서에 대한
호출을 제거 할 수 있습니다 . 그러나 이는 값의 형식에 따라 달라집니다. 인코딩 된 방식이 결과 순서를 변경할 수 있기 때문입니다.TO_NUMBER(...)
ORDER BY
출처
https://stackoverflow.com/questions/39930056