避免中间表的最佳方法是什么
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" 是主观的,但它归结为将每个内联视图视为一个微型程序:
- 保持每个内联视图简单,以简单的步骤组合它们,然后重复。
- 为每个内联视图使用好的名称和注释。您可能想要比 "A" 和 "B".
更好的东西
- 使用 Allman 风格的括号匹配,每行都有括号。内联视图很重要,需要额外的空格和对齐的括号。除了初级开发者,我们不需要对齐
SELECT
和 FROM
这样的关键字。我们需要对齐重要的边界,比如每个内联视图的括号。这将通过在 IDE. 中快速突出显示和 运行 代码来帮助您进行调试
- 通过使用内联视图而不是相关的子查询或常见的 table 表达式来保持子查询接口的简单。内联视图的优点在于它们的简单性 - 关系数据输入,关系数据输出。
有一组 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" 是主观的,但它归结为将每个内联视图视为一个微型程序:
- 保持每个内联视图简单,以简单的步骤组合它们,然后重复。
- 为每个内联视图使用好的名称和注释。您可能想要比 "A" 和 "B". 更好的东西
- 使用 Allman 风格的括号匹配,每行都有括号。内联视图很重要,需要额外的空格和对齐的括号。除了初级开发者,我们不需要对齐
SELECT
和FROM
这样的关键字。我们需要对齐重要的边界,比如每个内联视图的括号。这将通过在 IDE. 中快速突出显示和 运行 代码来帮助您进行调试
- 通过使用内联视图而不是相关的子查询或常见的 table 表达式来保持子查询接口的简单。内联视图的优点在于它们的简单性 - 关系数据输入,关系数据输出。