场景:
- 如果ACNO在LINK_MASTER中有记录,则amt将按照以下逻辑共享
- 如果acno在cust_fin表中的状态为“2”,则将共享客户表中的amt列。
- 如果cust_fin表状态中的acno为“0”或“1”,则将共享NPA表amt列。
- 如果acno在LINK_MASTER中没有任何记录,则将共享customer表中的amt。
- 如果客户中的标志为'C',则此字段的amt将被共享为NULL。
下面是表的XML和DML
create table link_master (
acno varchar2(200)
);
create table custfin (
status varchar2(200),
acno varchar2(200)
);
create table npa (
amt varchar2(200),
acno varchar2(200)
);
create table customer (
flag varchar2(200),
amt varchar2(200)
acno varchar2(200)
);
insert into link_master values('100');
insert into link_master values('101');
insert into link_master values('102');
insert into custfin values('1','101');
insert into custfin values('2','102');
insert into custfin values('0','100');
insert into npa values('3545','101');
insert into npa values('4566','102');
insert into npa values('4544','108');
insert into npa values('878','109');
insert into customer values('C','123','100');
insert into customer values('O','124','101');
insert into customer values('O','125','102');
insert into customer values('C','126','103');
insert into customer values('C','127','104');
insert into customer values('O','124','102');
预期结果:
ACNO STATUS FLAG AMT
100 0 C NULL
101 1 O 4566
102 2 O 4544
103 0 O 126
104 O 127
105 C NULL
我不需要在输出状态和标志列。只需要acno和amt。查询需要在select语句中。因为我需要将这个查询与其他查询联接起来,
3条答案
按热度按时间qeeaahzv1#
你可以使用类似的东西:
对于样本数据,其输出:
| ACNO|地位|标志|AMT|
| --|--|--|--|
| 101 | 1 |O| 3545 |
| 102 | 2 |O| 125 |
| 102 | 2 |O| 124 |
| 100 | 0 |C| * 空 |
| 104 | 空 *| C| * 空 |
| 103 | 空 *| C| * 空 *|
或者,找到最大的
amt
:对于样本数据,其输出:
| ACNO|地位|标志|AMT|
| --|--|--|--|
| 100 | 0 |C| * 空 |
| 101 | 1 |O| 3545 |
| 102 | 2 |O| 125 |
| 103 | 空 *| C| * 空 |
| 104 | 空 *| C| * 空 *|
注意:您不会得到预期的输出,因为:
1.示例数据中没有
acno = 105
的数据。acno = 101
无法连接到amt = 4566
。acno = 102
的状态为2
,因此amt
应该来自customer
,而不是npa
。acno = 103
的flag
是C
,而不是O
。所有这些都是输入数据的问题;修复它们,您可能会得到预期的输出。
fiddle
gjmwrych2#
我想这个应该可以。对于这个查询,我认为我不需要使用link_master表,因为你不需要在其中包含任何列。我认为你应该在link_master(acno)上有主键link_master_pk,而在引用link_master(acno)的其他表中有外键。
dohp0rv53#
你的问题中有些条件的顺序不清楚。问题是3个指令中的哪一个会影响其他指令。
例如,如果ACNO 100在表npa中定义了AMT,您希望得到什么?它存在于link_master表中,并且状态为0,因此开始指令说从npa表中获取AMT,但是有一个标志C指示为AMT获取缓存。会是哪一个呢???
无论如何,您需要使用CASE表达式,这是严格定义不同条件之间的顺序和交互的主要原因。CASE表达式是顺序的,这意味着-第一个满足的条件将获取值并退出CASE。关键是要把条件的方式/顺序,将导致你的计划。下面是一个选项-我把它的方式,一些ACNO存在或不存在于link_master表。如果是,则按照第1点中所述获得AMT。如果没有,那么我选择合并结合你的点2和3.
首先是一些样本数据:
下面是添加了一些注解的代码
注意:再一次,记住CASE表达式是顺序的。由您来定义条件的顺序和强度,并调整CASE表达式以获得所需的结果。