我正在使用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
;
答案 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 Ken
和Miss 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