父子查询已加入同一个表

时间:2017-11-29 04:37:26

标签: oracle

我正在使用ORACLE

我有这张桌子:

create table test (
 OFFICE varchar2(10)
,PERSON varchar2(20)
,KEY_CHIEF varchar2(10)
,FKEY_CHIEF varchar2(10)
);

这些是记录:

insert into test values ('Sales','Mr. Mark','10','');
insert into test values ('Admin','Mr. Ken','','10');
insert into test values ('Accounting','Miss. Love','','10');

我试图获得这样的查询:

|OFFICE        |PERSON         |CHIEF      
|Sales         |Mr. Mark       |NULL
|Admin         |Mr. Ken        |Mr. Mark
|Accounting    |Miss. Love     |Mr. Mark

我这样做但是它没有用,我希望你可以帮助我吗?

select t.office, t.person, t2.office, t2.person
     from test t
     left outer join test t2 
     ON t.KEY_CHIEF = t2.FKEY_CHIEF
;

1 个答案:

答案 0 :(得分:0)

您看到

等结果的原因
Sales       Mr. Mark    Admin       Mr. Ken
Sales       Mr. Mark    Accounting  Miss. Love
Admin       Mr. Ken     Sales       Mr. Mark
Accounting  Miss. Love  Sales       Mr. Mark

是因为你使用空字符串作为非主要人员的主要钥匙,也作为人员的外键chief。结果,它产生了循环依赖 - 马克先生有两位酋长,即Mr KenMiss Love

相反,你应该为每个人使用一个唯一的密钥,我建议使用NULL表示一个人没有首席。

这样的表格结构可能会提供更好的

create table test (
 PERSONID varchar2(10),
 OFFICE varchar2(10),
 PERSON varchar2(20),
 CHIEFID varchar2(10),

 CONSTRAINT PK_Person PRIMARY KEY(PERSONID),
 CONSTRAINT FKEY_CHIEF FOREIGN KEY (CHIEFID) REFERENCES test(PERSONID)
);

insert into test values ('10', 'Sales','Mr. Mark',null);
insert into test values ('11', 'Admin','Mr. Ken','10');
insert into test values ('12', 'Accounting','Miss. Love','10');

您的查询将变为:

select t.office, t.person, t2.office as ChiefOffice, t2.person as ChiefName
     from test t
     left outer join test t2 
     ON t.CHIEFID = t2.PERSONID;

结果

Office      Person      ChiefOffice  ChiefName
-----------------------------------------------
Sales       Mr. Mark    NULL         NULL
Admin       Mr. Ken     Sales        Mr. Mark
Accounting  Miss. Love  Sales        Mr. Mark