Что может быть лучшим способом избежать промежуточных таблиц - PullRequest
0 голосов
/ 02 апреля 2019

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

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

СОЗДАТЬ ТАБЛИЦУ А КАК ВЫБРАТЬ ID_LOAN ОТ master_copy ГДЕ ZERO_BAL_CODE IN (1);

СОЗДАТЬ ТАБЛИЦУ B КАК ВЫБРАТЬ master_copy.ID_LOAN, LOAN_AGE, master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS, current_upb ИЗ master_copy ВХОД В СОСТАВИТЬ master_copy.ID_LOAN A. * 100 *

CREATE TABLE prepidData AS ВЫБРАТЬ ID_LOAN, max (to_number (DELINQ_STATUS)) в качестве DELINQ_STATUS, max (loan_age) в качестве LOAN_AGE, max (ZERO_BAL_CODE) в виде ZERO_BAL_CODE, max (винтажный) в качестве винтажного, min (ACTUAL_LOSS) как фактическая потеря, MIN (NULLIF (current_upb, 0)) как текущая_группа FROM B от id_loan; изменить таблицу предоплаченных данных добавить loan_type varchar2 (255) по умолчанию «предоплата»;

дроп стол а; выпадающий стол b;

СОЗДАТЬ ТАБЛИЦУ А КАК ВЫБРАТЬ ID_LOAN ОТ master_copy ГДЕ ZERO_BAL_CODE IN (3);

СОЗДАТЬ ТАБЛИЦУ B КАК ВЫБРАТЬ master_copy.ID_LOAN, LOAN_AGE, master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS, current_upb ОТ master_copy ВХОД В СОСТАВИТЬ master_copy.ID_LOAN A. * 1015 =

CREATE TABLE DEFAULT_FORECLOSURE AS SELECT ID_LOAN, max (to_number (DELINQ_STATUS)) в качестве DELINQ_STATUS, max (loan_age) в качестве LOAN_AGE, max (ZERO_BAL_CODE) в качестве ZERO_BAL_CODE, max (винтажный) как min (ACTUAL_LOSS) как фактическая потеря, MIN (NULLIF (current_upb, 0)) как текущая_группа FROM B от id_loan; изменить таблицу DEFAULT_FORECLOSURE добавить loan_type varchar2 (255) по умолчанию 'default_foreclosure';

дроп стол а; выпадающий стол b;

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

1 Ответ

2 голосов
/ 04 апреля 2019

Лучший способ избежать промежуточных таблиц - использовать встроенные представления. Ваши запросы могут быть переписаны в один оператор 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. Используйте хорошие имена и комментарии для каждого встроенного представления. Вы, вероятно, захотите что-то лучше, чем «А» и «Б».
  3. Используйте сопоставление скобок в стиле Allman с круглыми скобками в каждой строке. Встроенные представления важны и заслуживают дополнительного пробела и выровненных скобок. За исключением начинающих разработчиков, нам не нужно выравнивать ключевые слова, такие как SELECT и FROM. Нам нужно выровнять важные границы, такие как скобки каждого встроенного представления. Это поможет вам отладить, быстро выделив и запустив код в IDE.
  4. Сохраните интерфейсы подзапросов простыми, используя встроенные представления вместо коррелированных подзапросов или общих табличных выражений. Прелесть встроенных представлений в их простоте - реляционные данные в, реляционные данные в.
...