2015-11-03 28 views
0

外連接2數據表:SQL - 有鑑於以下結構1個查找表

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; 

我在查找之間掙扎。 有人可以幫忙嗎?

非常感謝!

+0

其關係數據庫管理系統使用的是...? –

+0

Oracle,但我認爲在這種情況下並不重要。它肯定有一個適當的ANSI-SQL解決方案。 – royskatt

+0

..此外還提到了您的預期輸出.. –

回答

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與目標匹配並且名稱與源匹配時才返回區域信息。

+0

那麼,那實際上是我想要的輸出,我想根據在SOURCE_TABLE或TARGET_TABLE中缺少的PK來選擇那些記錄。謝謝! – royskatt

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;