今天开发过程中遇到了一个很麻烦的外连接的问题,到最后都没有找到很好的解决方法,最后只能用union all 实现了,虽然性能不比外连接,但至少拓展了外连接的局限性。 首先给出我测试用的三个表和数据(左右外连接道理是一样的,我只总结了左连接): KC21表: create table KC21
(
AKB020 VARCHAR2(14) not null,
AKC190 VARCHAR2(18) not null,
AAC001 VARCHAR2(20) not null
);
INSERT INTO KC21 (AKB020, AKC190, AAC001) VALUES('110', '266', '1302012062942');
INSERT INTO KC21 (AKB020, AKC190, AAC001) VALUES('456', '369', '1302012063210');
INSERT INTO KC21 (AKB020, AKC190, AAC001) VALUES('1000', '472', '1302012045811');
INSERT INTO KC21 (AKB020, AKC190, AAC001) VALUES('123', '335', '1302012063275');
KC24表:
create table KC24
(
AKB020 VARCHAR2(14) not null,
AKC190 VARCHAR2(18) not null,
AAE072 VARCHAR2(20) not null
);
insert into KC24 (AKB020, AKC190, AAE072)values ('110', '335', '2188038055');
insert into KC24 (AKB020, AKC190, AAE072)values ('11', '369', '2188038092');
insert into KC24 (AKB020, AKC190, AAE072)values ('1000', '472', '2188038197');
insert into KC24 (AKB020, AKC190, AAE072)values ('110', '339', '2188038058');
KB01表:
create table KB01
(
AKB020 VARCHAR2(14) not null,
AKB021 VARCHAR2(50)
);
insert into KB01 (AKB020, AKB021)values ('1000', '唐山实时测试医院');
insert into KB01 (AKB020, AKB021)values ('110', '唐山大医院A');
insert into KB01 (AKB020, AKB021)values ('123', '唐山大医院B');
insert into KB01 (AKB020, AKB021)values ('456', '唐山大医院C');
insert into KB01 (AKB020, AKB021)values ('11', '唐山大医院D');
oracle官方提供了两种方来实现外连接,一种是在from子句中使用left outer join/right outer join/full outer join,另外一种是
在where子句中使用大家都比较熟悉的符号“(+)”,这里我想写一下我对这两个方法的理解。
一、使用一个连接条件的外连接:
SQL> select * from kc21 left outer join kc24 on kc21.akb020=kc24.akb020;
AKB020 AKC190 AAC