我有两个表tab1和code_list(请参见下文)。 Tab1是一个大表(数百万条记录),并且code_list使用左联接与tab1联接。
create table tab1 (
key1 varchar2(10)
, key2 varchar2(10)
)
;
insert into tab1 values ('_10', '__1');
insert into tab1 values ('_10', '__2');
insert into tab1 values ('_10', '__3');
insert into tab1 values ('_10', '_99');
insert into tab1 values ('_10', null);
insert into tab1 values ('_20', '__1');
insert into tab1 values ('_20', '__2');
insert into tab1 values ('_20', '__3');
insert into tab1 values ('_20', '_99');
insert into tab1 values ('_20', null);
commit;
create table code_list (
key1 varchar2(10)
, key2 varchar2(10)
, value varchar2(10)
)
;
insert into code_list values ('_10', '__1', 'value1');
insert into code_list values ('_10', '__2', 'value2');
insert into code_list values ('_10', '__3', 'value3');
insert into code_list values ('_10', null, 'value4');
insert into code_list values ('_20', '__1', 'value1');
insert into code_list values ('_20', '__2', 'value2');
insert into code_list values ('_20', '__3', 'value3');
insert into code_list values ('_20', null, 'value5');
commit;
我正在尝试创建和SQL语句连接这样的两个表:
基于key1列进行连接
基于key2列进行连接
到目前为止,我有以下声明:
select t1.*
, t2.value
from tab1 t1
left join code_list t2 on t1.key1 = t2.key1
and (nvl(t1.key2, 'x') = nvl(t2.key2, 'x'))
;
它可以正常工作,但不能反映上述情况的最后一个(如果tab1的key2列中的值在code_list表的key2列中不存在,则加入到code_list中key2列中的值为NULL的行)
它给出以下结果:
_10 __1 value1
_10 __2 value2
_10 __3 value3
_10 (null) value4
_20 __1 value1
_20 __2 value2
_20 __3 value3
_20 (null) value5
_10 _99 (null)
_20 _99 (null)
但是我希望它给出以下结果:
_10 __1 value1
_10 __2 value2
_10 __3 value3
_10 (null) value4
_20 __1 value1
_20 __2 value2
_20 __3 value3
_20 (null) value5
_10 _99 value4
_20 _99 value5
最后两行不同。
感谢帮助。
答案 0 :(得分:1)
select t1.*, nvl(t2.value,t3.value) value
from tab1 t1
left join code_list t2
on t1.key1 = t2.key1
and (nvl(t1.key2, 'x') = nvl(t2.key2, 'x'))
left join code_list t3
on t1.key1 = t3.key1
and t3.key2 is null
不要忘记为大表tab1的连接条件创建功能索引:(key1,nvl(key2,'x'))