选择没有经理的员工 - 两种解决方案

问题描述 投票:0回答:1

我在一些测试平台上发现了以下测试任务。 我们有一个表定义:

CREATE TABLE employees
(
    id integer NOT NULL,
    name character varying(20),
    "managerId" integer,
    CONSTRAINT employees_pkey PRIMARY KEY (id)
)

如果任何其他员工将其

managerId
设置为该员工的 ID,则该员工就是经理。如果至少有其他员工的
managerId
设置为 Carol 的
id
,则 Carol 是经理。

编写一个查询,仅选择非经理的员工姓名。

我为此想出了两种可能的解决方案:

解决方案1:

select e.name
from public.employees as e
where not exists (select e1."managerId" from public.employees as e1 where e1."managerId" = e.id);

解决方案2:

select e.name
from employees as e 
left outer join public.employees as e1 on e.id = e1."managerId"
group by e.name
having count(e1.id) = 0;

正在运行一些自动化测试来验证代码是否正确。

我的第一个解决方案通过了验证,但我的第二个解决方案失败了。该消息只说:“工人有经理:错误答案”。当然,我不知道那个测试的内容。我尝试想出不同的测试场景,其中上述两种解决方案会带来不同的结果,但无法想出一个。

对于为我的两个解决方案带来不同结果的测试数据,您有什么建议吗?我真的很想知道我的第二个解决方案失败在哪里。

谢谢您的帮助。

sql select conditional-statements filtering
1个回答
0
投票

第二个可能是不正确的 - 但不太可能。

如果两个人同名,一个是经理,一个不是,那么 GROUP BY 会将这些人合并起来,并将他们视为经理。

比如你的数据如下,第二个就得不到结果

id          name                 managerId
----------- -------------------- -----------
1           Spartacus            NULL
2           Spartacus            1

选项

  • 人们经常使用第二个答案中的方法,但不是分组,而是使用第二个表中的 IS NULL (这意味着您不需要处理“GROUP BY”,您只需找到空白)。 例如,
select e.name
from employees as e 
left outer join public.employees as e1 on e.id = e1."managerId"
where e1.id IS NULL
  • 另一种方法是确保分组包含主键,例如,
select e.id, e.name
from #employees as e 
left outer join #employees as e1 on e.id = e1.managerId
group by e.id, e.name
having count(e1.id) = 0;

注意:在您的第二个答案中,您错过了其中一张表的

public.
之一。

© www.soinside.com 2019 - 2024. All rights reserved.