oraclesql:ON子句

oraclesql:ON子句,sql,oracle,Sql,Oracle,ON子句到底是做什么的?我不明白为什么e.department\u id和d.department\u id不会导致错误?e不是代表员工表,d不是代表部门表吗?那么,如果部门id不在employees表中,您如何使用e.department\u id?我对ON子句的用途感到非常困惑。ON子句是JOIN语法的一部分,它用于确定表应该如何相互连接,换句话说,哪些列将表相互关联 在您的情况下,您正在加入e.department\u id和d.department\u id上的表 e是employees

ON子句到底是做什么的?我不明白为什么e.department\u id和d.department\u id不会导致错误?e不是代表员工表,d不是代表部门表吗?那么,如果部门id不在employees表中,您如何使用e.department\u id?我对ON子句的用途感到非常困惑。

ON子句是
JOIN
语法的一部分,它用于确定表应该如何相互连接,换句话说,哪些列将表相互关联

在您的情况下,您正在加入
e.department\u id
d.department\u id
上的表

e
employees
表的别名,
d
departments
表的别名

当前查询正在执行
内部联接
,该联接将仅返回两个表中匹配的行

如果要返回所有
员工
,即使没有与员工行相关联的
部门
,则需要使用
左联接

SELECT e.employee_id, e.last_name, d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id=d.department_id);

不确定它是否有助于您理解,但可以(尽管不推荐)以
WHERE
子句的形式使用隐式内部联接重新编写此查询:

SELECT e.employee_id, e.last_name, d.department_id, d.location_id
FROM employees e 
LEFT JOIN departments d
  ON e.department_id=d.department_id;

ON
JOIN
条款的一部分。员工表中没有部门id是什么意思?我仍然不清楚ON(e.department\u id=d.department\u id)的作用是什么?我知道这本书与他们有关,但如何联系呢?部门id不是employees表(e)中的一列,那么它是如何关联它们的?@KG
employees
表有一个名为
部门id
的列,
部门
表也是如此。上的
用于指定要联接表的列。基本上,它表示您希望返回两个表中与
部门id
匹配的行。
部门id
员工
表(
e
)中的一列,但它不在返回的结果中(您在
选择
列表中没有列出)。您可以随时添加它并查看。哦。很抱歉我在employees表中没有看到department\u id表。谢谢@KG您能否发布
员工
部门
表格的定义?您的意思是(a)
Employees
没有
department\u id
列,并且(b)查询运行时没有错误。这听起来不对,这就是为什么评论越来越怀疑。为什么不建议按照你说的去做?我很想知道。@Phil-有人告诉我显式连接(特别是当它们很多的时候)更容易阅读和维护。我并没有暗示它会影响性能。我发现当它都在
WHERE
子句中时,阅读起来更容易,但这是我个人的偏好。事实上,作为一个Oracle问题,这是Oracle作为
的标准。。JOIN..
是最近才引入的。“虽然不推荐”完全是您个人的偏好,因此不应在回答中说明。Phil-
JOIN
现在是一个标准的一部分,事实上,Oracle以前有自己的
(+)
语法,现在仍然有,这不是我提供建议的材料。你显然可以保留你的意见。
SELECT e.employee_id, e.last_name, d.department_id, d.location_id
FROM employees e, departments d
WHERE (e.department_id=d.department_id);