【发布时间】:2021-05-18 14:38:29
【问题描述】:
我正在尝试查询此表:
问题是:
编写查询以查找拥有经理并在美国部门工作的员工的姓名(名字、姓氏)。
除了给出的解决方案之外,我尝试使用 Join 进行查询,另一个使用临时表进行查询。虽然这两个查询返回相同的结果,但子查询显示更多行。这是为什么呢?
使用连接:
select
employees.MANAGER_ID,
employees.FIRST_NAME,
employees.LAST_NAME,
locations.COUNTRY_ID
from employees
inner join departments on
employees.DEPARTMENT_ID = departments.DEPARTMENT_ID
inner join locations on
departments.LOCATION_ID = locations.LOCATION_ID
where locations.COUNTRY_ID = 'US';
使用临时表:
create temporary table deptwithloc
select
departments.DEPARTMENT_ID,
departments.LOCATION_ID,
locations.COUNTRY_ID
from departments
left join locations
on departments.LOCATION_ID = locations.LOCATION_ID
where locations.COUNTRY_ID = 'US';
子查询:
select
MANAGER_ID,
FIRST_NAME,
LAST_NAME
from employees
where MANAGER_ID
in (select
EMPLOYEE_ID
from employees
where DEPARTMENT_ID
in (select
DEPARTMENT_ID
from departments
where LOCATION_ID
in (select LOCATION_ID from locations where COUNTRY_ID='US' )));
请帮助我理解。数据库系统新手。
【问题讨论】:
-
你为什么使用左连接?您正在以一种可以被内部连接替换的方式使用它。 LEFT JOIN 返回由 NULL 扩展的 INNER JOIN 行 UNION ALL 不匹配的左表行。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 LEFT JOIN 之后,需要右 [sic] 表列不为 NULL 的 WHERE、INNER JOIN 或 HAVING 删除任何引入了 NULL 的行,即只留下 INNER JOIN 行,即“将 OUTER JOIN 转换为 INNER JOIN”。 PS 总是切到最小的代码是好的代码扩展到不返回你期望的代码&说出你期望的&为什么。
-
感谢@philipxy 的回复。你能解释一下你陈述的最后4行吗?我发现很难跟上。对不起,我是新手!!! :)
-
我不知道你的最后 4 行,因为它取决于屏幕宽度。后记是重新询问代码问题。 minimal reproducible example Re“将 OUTER JOIN 转变为 INNER JOIN”:通过您的查询表达式跟踪最小的代表性数据并查看我的评论如何应用。如果您不明白,请考虑发布问题。但首先要研究问题。这是一个常见问题解答。只需在谷歌上搜索引用的短语可能会出现许多问答。 Left Outer Join doesn't return all rows from my left table? PS 这与您的帖子问题是分开的。