>

중개 테이블 작성 및 삭제없이 프로 시저로 변환하려는 SQL 쿼리 세트가 있습니다. 아래에 샘플 쿼리를 포함 시켰습니다. 가장 좋은 방법은 무엇입니까? 절차가 처음이므로 그렇게하는 방법을 알려줄 수 있습니다.

커서를 사용하는 절차에서 커서를 사용할 수 있습니까? 쿼리의 마지막 줄에서 2 개의 중간 테이블을 조인합니다. 그 대신에 두 개의 커서를 결합 할 수 있습니까? 그렇다면 어떻게 할 수 있습니까? 그렇게 할 방법이 있습니까? 제안 해주세요

master_copy에서 SELECT ID_LOAN으로 테이블 A를 작성하십시오 (ZERO_BAL_CODE IN (1)).

선택한 master_copy.ID_LOAN, LOAN_AGE, master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS, current_upb FROM master_copy INNER JOIN A ON master_copy.ID_LOAN = A.ID_LOAN;

CREATE TABLE prepaidData AS SELECT ID_LOAN, max (to_number (DELINQ_STATUS))를 DELINQ_STATUS로, max (loan_age) AS LOAN_AGE, max (ZERO_BAL_CODE)를 ZERO_BAL_CODE, max (vintage)를 빈티지로, id_loan에 의한 current_upb로부터 FROM B 그룹으로서 min (ACTUAL_LOSS)를 actual_loss로서, MIN (NULLIF (current_upb, 0)); 테이블 선불 데이터 변경 loan_type varchar2 (255) 기본 '선불'추가;

드롭 테이블 a; 드롭 테이블 b;

master_copy에서 SELECT ID_LOAN으로 표 A 만들기 (ZERO_BAL_CODE IN (3));

선택한 master_copy.ID_LOAN, LOAN_AGE, master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS, current_upb FROM master_copy INNER JOIN A ON master_copy.ID_LOAN = A.ID_LOAN;

CREATE TABLE DEFAULT_FORECLOSURE AS SELECT ID_LOAN, max (to_number (DELINQ_STATUS)) as DELINQ_STATUS, max (loan_age) AS LOAN_AGE, max (ZERO_BAL_CODE) as ZERO_BAL_CODE, max (vintage) 빈티지, id_loan에 의한 current_upb로부터 FROM B 그룹으로서 min (ACTUAL_LOSS)를 actual_loss로서, MIN (NULLIF (current_upb, 0)); DEFAULT_FORECLOSURE 테이블 변경 loan_type 추가 varchar2 (255) 기본 'default_foreclosure';

드롭 테이블 a; 드롭 테이블 b;

aa_loan_type 테이블을 다음과 같이 작성하십시오 (prepaiddata union select * * DEFAULT_FORECLOSURE에서 select *);

  • 답변 # 1

    중간 테이블을 피하는 가장 좋은 방법은 인라인 뷰를 사용하는 것입니다. 다음과 같은 하나의 SQL 문으로 쿼리를 다시 작성할 수 있습니다.

    --aa_loan_type
    --
    --prepaidData
    SELECT ID_LOAN,max(to_number(DELINQ_STATUS)) as DELINQ_STATUS,max(loan_age) AS LOAN_AGE,max(ZERO_BAL_CODE) as ZERO_BAL_CODE,max(vintage) as vintage, min(ACTUAL_LOSS) as actual_loss,MIN(NULLIF(current_upb,0)) as current_upb, 'PREPAID' LOAN_TYPE
    FROM
    (
        --B
        SELECT
            master_copy.ID_LOAN,LOAN_AGE,master_copy.vintage,DELINQ_STATUS,ZERO_BAL_CODE,master_copy.ACTUAL_LOSS,current_upb
        FROM master_copy
        INNER JOIN
        (
            --A
            SELECT ID_LOAN FROM master_copy WHERE ZERO_BAL_CODE IN (1)
        ) A
        ON master_copy.ID_LOAN= A.ID_LOAN;
    ) B
    GROUP BY ID_LOAN
    union
    --DEFAULT_FORECLOSURE
    SELECT ID_LOAN,max(to_number(DELINQ_STATUS)) as DELINQ_STATUS,max(loan_age) AS LOAN_AGE,max(ZERO_BAL_CODE) as ZERO_BAL_CODE,max(vintage) as vintage, min(ACTUAL_LOSS) as actual_loss,MIN(NULLIF(current_upb,0)) as current_upb, 'default_foreclosure' loan_type
    FROM 
    (
        --B
        SELECT master_copy.ID_LOAN,LOAN_AGE,master_copy.vintage,DELINQ_STATUS,ZERO_BAL_CODE,master_copy.ACTUAL_LOSS,current_upb
        FROM master_copy
        INNER JOIN
        (
            --A
            SELECT ID_LOAN FROM master_copy WHERE ZERO_BAL_CODE IN (3)
        ) A
            ON master_copy.ID_LOAN= A.ID_LOAN
    ) B
    group by id_loan;
    
    

    정확하게 구축되면 하나의 큰 SQL 문이 여러 개의 작은 SQL 문보다 훨씬 낫습니다. 전체 코드는 더 간단하고 (객체가 적고, IDE에서 디버깅하기가 더 쉬워) 잠재적으로 훨씬 빠릅니다 (데이터를 작성할 필요가없고 옵티마이 저가 더 영리한 일을 할 수있는 기회를 제공합니다)

    대규모 SQL을 "정확하게"구축하는 것은 주관적이지만 각 인라인 뷰를 미니어처 프로그램으로 취급하는 것으로 요약됩니다.

    <올>

    각 인라인보기를 단순하게 유지하고 간단한 단계로 결합한 후 반복하십시오.

    인라인보기마다 적절한 이름과 주석을 사용하십시오. "A"와 "B"보다 더 나은 것을 원할 것입니다.

    각 줄에 괄호를 사용하여 Allman 스타일의 대괄호를 사용하십시오. 인라인보기는 중요하며 추가 공백과 정렬 된 괄호가 필요합니다. 초보자 개발자를 제외하고 SELECT 와 같은 키워드를 정렬 할 필요가 없습니다.  그리고 FROM . 각 인라인 뷰의 괄호와 같은 중요한 경계를 정렬해야합니다. IDE에서 코드를 빠르게 강조 표시하고 실행하여 디버깅하는 데 도움이됩니다.

    상관 된 서브 쿼리 또는 공통 테이블 표현식 대신 인라인 뷰를 사용하여 서브 쿼리 인터페이스를 단순하게 유지하십시오. 인라인보기의 장점은 단순성입니다. 관계형 데이터, 관계형 데이터입니다.

  • 이전 python - 텍스트에서 유사한 의미의 단어를 공통 동의어로 대체하는 방법
  • 다음 elisp - emacs에서 글꼴 크기를 평가 된 값으로 설정하는 방법은 무엇입니까?