如何在 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);
我想将员工转介给他们的经理。
我这里有两个例子。他们两个都给了我一个我不想要的解决方案。
第一个自连接查询:
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);