0

我正在使用标准 HR Oracle 数据库进行练习,我对集合运算符 INTERSECT 的使用存有疑问。我有这些情况:

SELECT       employee_id, job_id, department_id
FROM         employees
NATURAL JOIN job_history;

自然连接结果

SELECT employee_id, job_id, department_id
FROM   employees 
INTERSECT
SELECT employee_id, job_id, department_id 
FROM   job_history;

相交结果

两个语句具有相同的结果集。有没有性能差异???谢谢。

4

2 回答 2

2

Natural join是一个非常不同的操作intersect

在这两个查询中,您似乎只选择了两个表中存在的同名列。(否则一开始比较natural joinintersect没有意义。)这是您应该在问题陈述中明确说明的内容。

那么:如果对于同一个表employee/job/department中有几行job_history,那么自然连接中就会存在相同的行数(假设employee_id是PK in employees)。另一方面,intersect删除重复项。因此,即使以您设置的方式,这两个操作也不相同 - 除非您愿意SELECT DISTINCT在加入之前(或之后)加入,否则会增加更多开销。

如果您需要intersect, 则使用intersect运算符,这就是它的用途。每当您认为找到了另一种方法来获得相同的结果时,通常是因为您忽略了某些事情(例如在这种情况下对重复项的处理)。

于 2017-01-18T16:50:49.097 回答
1

如果任何列值为 NULL,SQLite 的 Natural Join 会从两个表中排除相同的匹配项。

给定表格:

    +----------------------------------------+
    | 员工 |
    +----------------------------------------+
    | 员工编号 | 工作ID | 部门ID |
    +-------------+--------+----------------+
    | 1 | 空 | 10 |
    +-------------+--------+----------------+
    | 2 | 空 | 20 |
    +-------------+--------+----------------+
    | 3 | "id3" | 30 |
    +-------------+--------+----------------+

和:

    +----------------------------------------+
    | 工作历史 |
    +----------------------------------------+
    | 员工编号 | 工作ID | 部门ID |
    +-------------+--------+----------------+
    | 1 | 空 | 10 |
    +-------------+--------+----------------+
    | 2 | 空 | 20 |
    +-------------+--------+----------------+
    | 3 | "id3" | 30 |
    +-------------+--------+----------------+   
    | 4 | "id4" | 40 |
    +-------------+--------+----------------+
select * from employees natural join job_history

结果:

+-------------+--------+----------------+
| 2 | 空 | 20 |
+-------------+--------+----------------+
| 3 | "id3" | 30 |
+-------------+--------+----------------+
select * from employees intersect select * from job_history

结果:

+-------------+--------+----------------+
| 1 | 空 | 10 |
+-------------+--------+----------------+
| 2 | 空 | 20 |
+-------------+--------+----------------+
| 3 | "id3" | 30 |
+-------------+--------+----------------+
于 2018-04-17T20:38:18.077 回答