避免中间表的最佳方法是什么

What could be best possible way to avoid the intermediary tables

有一组 sql 查询,我想将其转换为过程而无需中介 table 创建和删除。我在下面包含了示例查询。这样做的最佳方法是什么?由于我是程序的新手,可以建议我如何操作。

我们可以在程序中使用游标吗?在查询的最后一行,我加入了 2 个中介 tables。而不是那个我们可以加入两个游标吗?如果是这样,我们该怎么做?有什么办法可以做到这一点。请建议我。

CREATE TABLE A AS SELECT ID_LOAN FROM master_copy WHERE ZERO_BAL_CODE IN (1);

创建 TABLE B AS SELECT master_copy.ID_LOAN,LOAN_AGE,master_copy.vintage,DELINQ_STATUS,ZERO_BAL_CODE,master_copy.ACTUAL_LOSS,current_upb 来自 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)) 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 FROM B group by id_loan; alter table prepaiddata add loan_type varchar2(255) default 'prepaid';

下降table一个; 下降 table b;

CREATE TABLE A AS SELECT ID_LOAN FROM master_copy WHERE ZERO_BAL_CODE IN (3);

创建 TABLE B AS SELECT master_copy.ID_LOAN,LOAN_AGE,master_copy.vintage,DELINQ_STATUS,ZERO_BAL_CODE,master_copy.ACTUAL_LOSS,current_upb 来自 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) 作为年份, min(ACTUAL_LOSS) as actual_loss,MIN(NULLIF(current_upb,0)) as current_upb FROM B group by id_loan; alter table DEFAULT_FORECLOSURE add loan_type varchar2(255) default 'default_foreclosure';

下降table一个; 下降 table b;

create table aa_loan_type as(select * from prepaiddata union select * from DEFAULT_FORECLOSURE);

避免中间 tables 的最佳方法是使用内联视图。您的查询可以改写成这个 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 "correctly" 是主观的,但它归结为将每个内联视图视为一个微型程序:

  1. 保持每个内联视图简单,以简单的步骤组合它们,然后重复。
  2. 为每个内联视图使用好的名称和注释。您可能想要比 "A" 和 "B".
  3. 更好的东西
  4. 使用 Allman 风格的括号匹配,每行都有括号。内联视图很重要,需要额外的空格和对齐的括号。除了初级开发者,我们不需要对齐 SELECTFROM 这样的关键字。我们需要对齐重要的边界,比如每个内联视图的括号。这将通过在 IDE.
  5. 中快速突出显示和 运行 代码来帮助您进行调试
  6. 通过使用内联视图而不是相关的子查询或常见的 table 表达式来保持子查询接口的简单。内联视图的优点在于它们的简单性 - 关系数据输入,关系数据输出。