SQL - 具有1个查找表的Outerjoin 2数据表

时间:2015-11-03 14:46:48

标签: sql oracle lookup

鉴于以下结构:

create table region(
region_id number,
region_name varchar(50),
constraint region_pk primary key (region_id)
);

create table source_table(
ticket_id number,
region_name varchar(50),
constraint source_table_pk primary key (ticket_id, region_name)
);

create table target_table(
ticket_id number,
region_id number,
constraint target_table_pk primary key (ticket_id, region_id),
constraint fk_region_id foreign key (region_id) references region(region_id)
);

insert into region values(1,'north');
insert into region values(2,'east');
insert into region values(3,'south');
insert into region values(4,'west');

insert into source_table values(101,'north');
insert into source_table values(102,'north');
insert into source_table values(103,'west');
insert into source_table values(104,'south');
insert into source_table values(105,'east');
insert into source_table values(106,'west');

insert into target_table values(101,1);
insert into target_table values(102,1);
insert into target_table values(103,4);
insert into target_table values(104,3);
insert into target_table values(105,2);
insert into target_table values(107,2);

commit;

如何使用TARGET_TABLE正确完全外部联接 SOURCE_TABLE。以下不起作用:

select * from target_table tt
full outer join source_table st
on tt.ticket_id = st.ticket_id
join region r
on r.region_id=tt.region_id
where st.region_name=r.region_name;

我在中间查找很困难。 有人可以帮忙吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

代码更容易理解的示例:

select * from 
  (select * from target_table tt join region rtt on tt.region_id = rtt.region_id) target_region
  full outer join 
  (select * from source_table st join region rst on st.region_name = rst.region_name) source_region 
  on target_region.ticket_id = source_region.ticket_id;

答案 1 :(得分:1)

您描述问题的方式,您需要full outer join,后跟left join没有where条款:

select *
from target_table tt full outer join
     source_table st
     on tt.ticket_id = st.ticket_id left join
     region r
     on r.region_id = tt.region_id and r.region_name = st.region_name;

我怀疑这不是你真正想做的事情,但它似乎是你问题的答案。仅当id与目标匹配且名称与源匹配时,才返回区域信息。