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

How to correctly SELF JOIN tables in oracle 11g?

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

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

第一个自连接查询:

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

解决方案截图:

现在我只得到所有的经理而不是员工

第二次自连接查询:

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

解决方案截图:

这将导致与上述额外员工相同的结果。问题是员工没有提到他们的经理(经理仍然提到他们自己)。

目前这是我插入数据库的内容。也许我的插入值有问题。因为给定的遮阳篷不起作用

--员工

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);

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

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;

或者,因为问题可能与原始问题 table 重复,您可能需要:

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;

您要么是向后连接,要么是从错误的一侧拉动(取决于您如何看待它)。如果您使用不同的 table 别名,它会变得更加明显:

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);