我在一些测试平台上发现了以下测试任务。 我们有一个表定义:
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;
正在运行一些自动化测试来验证代码是否正确。
我的第一个解决方案通过了验证,但我的第二个解决方案失败了。该消息只说:“工人有经理:错误答案”。当然,我不知道那个测试的内容。我尝试想出不同的测试场景,其中上述两种解决方案会带来不同的结果,但无法想出一个。
对于为我的两个解决方案带来不同结果的测试数据,您有什么建议吗?我真的很想知道我的第二个解决方案失败在哪里。
谢谢您的帮助。
第二个可能是不正确的 - 但不太可能。
如果两个人同名,一个是经理,一个不是,那么 GROUP BY 会将这些人合并起来,并将他们视为经理。
比如你的数据如下,第二个就得不到结果
id name managerId
----------- -------------------- -----------
1 Spartacus NULL
2 Spartacus 1
选项
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.
之一。