【问题标题】:How to correctly SELF JOIN tables in oracle 11g?如何在 oracle 11g 中正确地 SELF JOIN 表?
【发布时间】:2015-06-04 21:29:16
【问题描述】:

我想将员工推荐给他们的经理。

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

第一个自连接查询:

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

【问题讨论】:

  • 您应该编辑您的查询并显示 (1) 您确实想要的结果和 (2) 进入查询的样本数据。
  • 是的,您的插入错误。 manager 应该是第一条记录上的 11111119 和第二条记录上的 null
  • 经理应该是最后一个数字,而不是空值。我希望我说得通。现在我看到我正在向自己推荐一位经理,但我还能如何解决这个问题?我在这方面有点菜鸟:|

标签: sql join oracle11g self-join


【解决方案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);

【讨论】:

  • 所有解决方案都不起作用。我认为这是我的插入值不正确。你能看一下吗?我更新了我的问题
  • 是的,您的插入似乎是错误的 - 您没有为员工 (Joost) 分配经理,而将经理 (Rick) 分配给他自己。
  • 我明白你在说什么。我现在明白了,谢谢。知道如何解决这个问题吗?我应该给这个经理一个不同的号码还是我应该怎么做?
  • @MaximedeLange Garbage in, Garbage out - 修复源数据。 manager 应该是第一条记录上的11111119 和第二条记录上的null
  • 抱歉问。我今天有点慢。你能给我一个如何正确实现插入语句的例子吗?因为我明白你在说什么,但我无法以某种方式实现它:S。不好意思问
【解决方案2】:

问题是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;

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

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;

【讨论】:

  • --MEDEWERKERS 插入 MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager) values(11111112, 'Joost', 'Eindhoven Langloopstraat 1', 0678765478, 1500, ' baliemedewerker', 10, null);插入 MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager) values(11111119, 'Rick','Gemert. Dunneweg 76', 0678768315, 2200, 'Manager', 10, 11111119);跨度>
  • 对不起,我按错了按钮。我只是想更新我的帖子:)。无论如何,这是我的插入值,我认为存在问题。而不是你的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多