Oracle SQL以多对一的关系加入

时间:2013-10-29 10:30:15

标签: sql oracle

提前感谢您提供的任何帮助。我想我可能会问一个微不足道的问题,但我无法确定我将如何做到这一点,也无法确定究竟要搜索什么。如果浪费你的时间,我很抱歉。

所以我有两个表 TableA TableB ,我需要以特定方式加入这两组数据,我将在下面参考一些示例表进行说明

表A:

Name | Contact_1 | Contact_2 | Contact_3 
----------------------------------------
Joe  | Anne      | Sue       | Phil
Dan  | Tom       |           |          
May  | Jeff      | Pete      | Tim

表B:

Name | Contact_No
-----------------
Anne | 123456789
Sue  | 234567891
Phil | 345678912
Tom  | 456789123
Jeff | 567891234
Pete | 678912345
Tim  | 789123456

在TableA和TableB之间加入时产生的表:

TableA.Contact_1 = TableB.Name 和 TableA.Contact_2 = TableB.Name 和 TableA.Contact_3 = TableB.Name

给出:

Name | Contact_1 | ContactNo_1 | Contact_2 | ContactNo_2 | Contact_3 | ContactNo_3
----------------------------------------
Joe  | Anne      | 123456789   | Sue       | 234567891   | Phil      | 345678912
Dan  | Tom       | 456789123   |           |             |           |
May  | Jeff      | 567891234   | Pete      | 678912345   | Tim       | 789123456

这只是解释我的问题的一个简单例子。很抱歉这么长的解释,但我宁愿有一个详细的例子来限制混淆。

谢谢!

1 个答案:

答案 0 :(得分:2)

您必须将TableA与TableB连接三次:

select ta.name, 
       ta.contact_1, tb1.contact_no, 
       ta.contact_2, tb2.contact_no, 
       ta.contact_3, tb3.contact_no 
from TableA ta
     left join TableB tb1 on ta.contact_1 = tb1.name
     left join TableB tb2 on ta.contact_2 = tb2.name
     left join TableB tb3 on ta.contact_3 = tb3.name;

如果TableA.contact_1(_2,_3)中允许空值,则需要左连接。

修改

但是,请注意,通常最好有一个单独的表来保持连接对(名称,名称)的事实,例如,

create table TableA(a_name varchar primary key);
create table TableB(b_name varchar primary key, 
                     b_contact_no varchar);
create table Contacts(a_name varchar,
                      b_name varchar,
                      primary key(a_name,b_name),
                      foreign key(a_name) references TableA(a_name),
                      foreign key(b_name) references TableB(B_name));

这样,您可以在不必更改数据库架构的情况下为仲裁数量的联系人建模。