SQL - Outerjoin 2 数据 tables with 1 lookup table

SQL - Outerjoin 2 data tables with 1 lookup table

给定以下结构:

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;

如何正确地 完全外连接 SOURCE_TABLE 与 TARGET_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;

我在两者之间的查找中挣扎。 有人可以帮忙吗?

非常感谢!

按照您描述问题的方式,您需要一个 full outer join 后跟一个没有 where 子句的 left join

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;

我怀疑这不是您真正想要做的,但这似乎是您问题的答案。此returns区域信息仅当id匹配目标且名称匹配源时。

代码更容易理解的示例:

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;