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;
给定以下结构:
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;