아래의 쿼리를 생각해 냈지만 80,000 개의 결과를 얻으려면 45 분이 걸렸습니다 ... BILLPRC 테이블은 WHERE 절 앞에 총계가 두 배가되었을 것입니다. 그것을 가속화하기 위해 쿼리를 작성하는 더 좋은 방법이 있는지 궁금합니다. 이것은 매우 애매한 질문 일 수 있으므로 더 많은 정보가 필요하면 더 설명 할 수 있습니다.VBA에서 SQL을 사용하여 DB2 데이터베이스에서 작업하는 일부 사용자 정의 보고서를 만들기 위해 JOIN의 CASE를 사용하여 SQL 쿼리를 가속화합니다.
SELECT b.BLCO# || RIGHT('00000' || b.BLACCT, 5) Acct, b.BLRECT Type, b.BLREC# Record, i.INAME || ' ' || i.INAME2 Desc, b.BLPPGM# Promo, SUBSTR(b.BLPEFFD, 4, 2) || SUBSTR(b.BLPEFFD, 6, 2) || SUBSTR(b.BLPEFFD, 2, 2) Eff, SUBSTR(b.BLPENDD, 4, 2) || SUBSTR(b.BLPENDD, 6, 2) || SUBSTR(b.BLPENDD, 2, 2) Exp, CASE
WHEN (p.PPPRC1 = '0') THEN (p.PPPRC2)
WHEN (p.PPPRC1 != '0') THEN (p.PPPRC1) END Price,
CASE
WHEN (p.PPPRC1 = '0') THEN (p.PPCST2)
WHEN (p.PPPRC1 != '0') THEN (p.PPCST1) END Allow, i.ILASTC Cost
FROM QS36F.BILLPRC b
LEFT JOIN QS36F.PROMO p
ON b.BLREC# || b.BLPPGM# = p.PPREC || p.PPPGM#
LEFT JOIN QS36F.ITEM i
ON CASE
WHEN (b.BLRECT = 'I') AND (b.BLREC# = i.IMFGR || i.ICOLOR || i.IPATT) THEN 1
WHEN (b.BLRECT = 'P') AND (b.BLREC# = i.IPRCCD) THEN 1
END = 1
WHERE (b.BLPPGM# != '') AND (b.BLSTS != 'H')
ORDER BY (b.BLACCT)
기록 금액 및 사례를 확인할 수없는 느낌이 있습니다.
인덱싱 된보기를 사용할 수 있습니까? – userDEV
가장 먼저 수행해야 할 작업은 QS36F에서 파일을 이동하고 실제 관계형 테이블을 작성하는 것입니다. System/36 환경은 성능이 우수한 SQL에 적합하지 않습니다 (중간 성능의 경우조차도 아닐 수도 있습니다). 실제 파일 정의를 자세히 살펴보십시오. – user2338816
'b.BLREC# || b.BLPPGM # = p.PPREC || p.PPPGM #'은 멀티 파트 키를 가지고 있음을 의미합니다. 이는 훌륭한 정규화 방법을 위반하는 것입니다. 또한 인덱스를 사용할 수 없으므로 쿼리가 느려질 수 있습니다. 서로 열을 비교할 수 있습니까? 'SELECT CASE'는'p'가'null' 일 때 명시 적으로 대소 문자를 나열하지 않습니다. DB2에는 CYMD 날짜를 다른 형식으로 변환하는 유틸리티가 있습니다. 'ON CASE'는 'OR'조건으로 작동하고 일부는 도움이됩니다. –