如何在oracle 11g中正确SELF JOIN表?

时间:2015-03-31 13:59:39

标签: sql join oracle11g self-join

我想将员工转介给他们的经理。

我在这里有两个例子。他们都给了我一个我不想要的解决方案。

首次自我加入查询:

select m1.naam as medewerker, m2.naam as manager
from medewerkers m1, medewerkers m2
where m1.medewerker_id = m2.manager
order by 1;

解决方案的屏幕截图:

enter image description here

现在我只收到所有经理而不是雇员

第二次自我加入查询:

select b.naam as employee, a.naam as manager
from medewerkers a right outer join medewerkers b on(a.medewerker_id = b.manager);

解决方案的屏幕截图:

enter image description here

这将导致与额外员工相同的上述情况。问题是员工没有被提交给他们的经理(经理仍然被称为他们自己)。

目前这是我插入数据库的内容。也许我的插入值可能有问题。因为给定的拳击手不会工作

- 雇员

insert into MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values(11111112, 'Joost', 'Eindhoven Langloopstraat 1', 0678765478, 1500, 'baliemedewerker', 10, null);
insert into MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values(11111119, 'Rick','Gemert. Dunneweg 76', 0678768315, 2200, 'Manager', 10, 11111119);

2 个答案:

答案 0 :(得分:1)

你要么倒退,要么从错误的方向拉(取决于你怎么看)。如果使用不同的表别名,则会更加明显:

select emp.naam as medewerker, man.naam as manager
from medewerkers emp, medewerkers man
where emp.medewerker_id = man.manager   --asking for rows where the employee is the manager's manager!
order by 1;

更改您的连接顺序(并使用正确的连接语法):

select emp.naam as medewerker, man.naam as manager
from medewerkers emp
INNER JOIN medewerkers man
    ON emp.manager = man.medewerker_id 
order by 1;

这是修复错误输入数据的正确陈述:

insert into MEDEWERKERS 
    (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values
    (11111112, 'Joost', 'Eindhoven Langloopstraat 1', 0678765478, 1500, 'baliemedewerker', 10, 11111119);

insert into MEDEWERKERS 
   (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values
    (11111119, 'Rick','Gemert. Dunneweg 76', 0678768315, 2200, 'Manager', 10, null);

答案 1 :(得分:0)

问题是Rick/Rick行等等吗?如果是这样,您可以通过修复NULL子句替换管理员名称on

select e.naam as medewerker, m.naam as manager
from medewerkers e left join
     medewerkers m
     on m.medewerker_id = e.manager and
        m.medewerker_id <> e.medewerker_id
order by 1;

或者,因为原始表中的问题可能重复,您可能需要:

select e.naam as medewerker, m.naam as manager
from medewerkers e left join
     medewerkers m
     on m.medewerker_id = e.manager
where e.medewerker_id <> e.manager     
order by 1;