Какой может быть наилучший способ избежать промежуточных таблиц

#oracle #oracle11g #cursor #procedure

#Oracle #oracle11g #курсор #процедура

Вопрос:

Существует набор SQL-запросов, которые я хочу преобразовать в процедуру без создания и удаления промежуточных таблиц. Я включил примеры запросов ниже. какой может быть наилучший способ для этого? Поскольку я новичок в процедурах, могу посоветовать мне, как это сделать.

Можем ли мы использовать курсор в процедурах для этого? В последней строке запроса я присоединяюсь к 2 промежуточным таблицам. вместо этого мы можем объединить два курсора? Если да, то как мы можем это сделать? Есть ли какой-либо способ сделать это. Пожалуйста, предложите мне.

СОЗДАЙТЕ ТАБЛИЦУ A КАК SELECT ID_LOAN ИЗ master_copy, ГДЕ ZERO_BAL_CODE В (1);

СОЗДАЙТЕ ТАБЛИЦУ B Как ВЫБЕРИТЕ master_copy.ID_LOAN, LOAN_AGE,master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS,current_upb ИЗ master_copy ВНУТРЕННЕГО СОЕДИНЕНИЯ A В master_copy.ID_LOAN= A.ID_LOAN;

СОЗДАЙТЕ ТАБЛИЦУ prepaidData КАК SELECT ID_LOAN, max(to_number(DELINQ_STATUS)) как DELINQ_STATUS, max(loan_age) КАК LOAN_AGE, max(ZERO_BAL_CODE) как ZERO_BAL_CODE, max (vintage) как vintage, min (ACTUAL_LOSS) как actual_loss, MIN(NULLIF(current_upb, 0)) как current_upb ИЗ группы B по id_loan; изменить таблицу prepaiddata добавить loan_type varchar2(255) по умолчанию ‘предоплаченный’;

удалите таблицу a; удалите таблицу b;

СОЗДАЙТЕ ТАБЛИЦУ A КАК SELECT ID_LOAN ИЗ master_copy, ГДЕ ZERO_BAL_CODE В (3);

СОЗДАЙТЕ ТАБЛИЦУ B Как ВЫБЕРИТЕ master_copy.ID_LOAN, LOAN_AGE,master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS,current_upb ИЗ master_copy ВНУТРЕННЕГО СОЕДИНЕНИЯ A В master_copy.ID_LOAN= A.ID_LOAN;

СОЗДАЙТЕ ТАБЛИЦУ DEFAULT_FORECLOSURE КАК SELECT ID_LOAN, max(to_number(DELINQ_STATUS)) как DELINQ_STATUS, max(loan_age) КАК LOAN_AGE, max(ZERO_BAL_CODE) как ZERO_BAL_CODE, max (vintage) как vintage, min (ACTUAL_LOSS) как actual_loss, MIN(NULLIF(current_upb,0)) как current_upb ИЗ группы B по id_loan; изменить таблицу DEFAULT_FORECLOSURE, добавить loan_type varchar2(255) по умолчанию ‘default_foreclosure’;

удалите таблицу a; удалите таблицу b;

создайте таблицу aa_loan_type как (выберите * из объединения prepaiddata выберите * из DEFAULT_FORECLOSURE);

Ответ №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 «правильно» субъективно, но это сводится к обработке каждого встроенного представления как миниатюрной программы:

  1. Упростите каждое встроенное представление, объедините их в простые шаги и повторите.
  2. Используйте правильные имена и комментарии для каждого встроенного представления. Вероятно, вам захочется чего-то лучшего, чем «A» и «B».
  3. Используйте соответствие скобок в стиле Allman с круглыми скобками в каждой строке. Встроенные представления важны и заслуживают дополнительных пробелов и выровненных круглых скобок. За исключением начинающих разработчиков, нам не нужно выравнивать ключевые слова, такие как SELECT и FROM . Нам нужно выровнять важные границы, такие как круглые скобки каждого встроенного представления. Это поможет вам отлаживать, быстро выделяя и запуская код в IDE.
  4. Упростите интерфейсы подзапросов, используя встроенные представления вместо коррелированных подзапросов или общих табличных выражений. Прелесть встроенных представлений заключается в их простоте — ввод реляционных данных, вывод реляционных данных.