[英]What is the difference between Join and Natural Join?
我正在学习Oracle SQL,现在我仍然坚持加入章节。 我无法理解Join和Natural Join之间的区别
SELECT employee_id, job_id, department_id,
e.last_name, e.hire_date, j.end_date
FROM employees e
NATURAL JOIN job_history j;
176 SA_REP 80 Taylor 24/03/2006 31/12/2006
SELECT e.employee_id, e.job_id, e.department_id,
e.last_name, e.hire_date, j.end_date
FROM employees e
JOIN job_history j
ON (e.department_id = j.department_id)
ORDER BY employee_id, last_name;
172 SA_REP 80 Bates 24/03/2007 31/12/2006
173 SA_REP 80 Kumar 21/04/2008 31/12/2007
173 SA_REP 80 Kumar 21/04/2008 31/12/2006
174 SA_REP 80 Abel 11/05/2004 31/12/2007
174 SA_REP 80 Abel 11/05/2004 31/12/2006
175 SA_REP 80 Hutton 19/03/2005 31/12/2007
175 SA_REP 80 Hutton 19/03/2005 31/12/2006
176 SA_REP 80 Taylor 24/03/2006 31/12/2007
176 SA_REP 80 Taylor 24/03/2006 31/12/2006
177 SA_REP 80 Livingston 23/04/2006 31/12/2007
177 SA_REP 80 Livingston 23/04/2006 31/12/2006
如果Join和Natural Join都具有相似的功能,我不知道为什么会收到不同的结果。
不要使用natural join
。 这是一个等待发生的错误。
显式join
具有on
子句,该子句列出了表之间匹配的条件。 在您的示例中, department_id
用于此目的(尽管其他列可能可用)。
using
子句是另一个非常有用的选择。 你用它作为:
FROM employees e JOIN
job_history j
USING (department_id)
它在两个表中找到department_id
并将其用于连接条件。
NATURAL JOIN
为表中相同的所有列添加JOIN
条件。 在您的情况下,这将是department_id
加上其他列 。
问题 - 正如您所遇到的 - 是您不知道哪些列用于join
。 更糟糕的是,不使用显式外键引用。
因为您的查询没有指定发生了什么,所以存在很多错误和错误的余地。 没有实际需要NATURAL JOIN
,所以你也可以学会使用ON
和USING
。
只是为了明确显而易见的事情:你的第一个查询会产生不同的结果,因为它在语义上不等同于你的第二个查询。
以下是NATURAL JOIN
版本的建议重写:
WITH e AS
( SELECT employee_id, job_id, department_id,
last_name, hire_date
FROM employees ),
j AS
( SELECT department_id, end_date
FROM job_history )
SELECT *
FROM e NATURAL JOIN j
ORDER
BY employee_id, last_name;
在上面的查询中没有“等待发生的错误”,即使我有 - 震惊! 恐怖! - 使用SELECT *
以及NATURAL JOIN
(两者都禁止使用SQL flock):CTE中的投影列可以保护您的查询,从列添加到表employees
和job_history
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.