了解自联接不同查询

时间:2018-11-03 23:05:32

标签: sql self-join

我不确定有关EMPLOYEE A和EMPLOYEE B的查询的工作方式。我知道不重复地删除重复的值,但是如果只选择A.EMPLOYEE_ID,A.LAST_NAME,A.TITLE,为什么会有两个表, SELECT部分​​中是否也不需要包含B.EMPLOYEE_ID,B.LAST_NAME和B.TITLE吗?它是如何工作的?我也知道<>意味着不等于。

SELECT DISTINCT A.EMPLOYEE_ID, A.LAST_NAME, A.TITLE
FROM EMPLOYEE A, EMPLOYEE B
WHERE A.EMPLOYEE_ID  <> B.EMPLOYEE_ID
AND  A.TITLE  <> B.TITLE
AND B.LAST_NAME = A.LAST_NAME

2 个答案:

答案 0 :(得分:0)

此查询返回与另一名雇员共享姓氏的所有雇员,而不是职称或雇员ID。

使用exists编写此查询的更有效方法:

select e.*
from employee e
where exists (select 1
              from employee e2
              where e2.last_name = e.last_name and
                    e2.employee_id <> e.employee_id and
                    e2.title <> e.title
             );

以这种方式编写查询可节省从join删除重复项的工作。

为了提高性能,您需要在employee(last_name, employee_id, title)上建立索引。

答案 1 :(得分:0)

返回的行不是一个表的限制和投影,它们是联接和限制后剩余行的投影。它们是来自表中的行的列,但表中的行之间也具有某些匹配项。。碰巧是所有行的限制和投影行,这些行可以由表中的某行与表中的某行配对而成,这就是逗号乘积(交叉联接)给出的结果。 (可以使用显式交叉联接或内部联接。)

返回的行用于存在另一名姓氏相同但ID和标题不同的员工的员工。

仍然-为什么要编写该特定查询表达式?查询要求满足某些条件的行。每个基本表都是满足某些条件的行。每个关系运算符和SQL子表达式都会计算满足一个条件的行,该条件是其参数表的条件的某种转换。 x NATURAL JOIN y是满足x准则和y准则的行; x UNION y是满足x准则或y准则的行; x WHERE c是满足x AND c准则的行;等等。因此,我们编写了一个SQL查询,其条件是所需行的条件。不幸的是,这从未明确地教导过。 (关系和逻辑运算符之间以及关系值和标准之间的这种对应关系是关系模型的基础。)

Is there any rule of thumb to construct SQL query from a human-readable description?
What is a self join for? (in english)