繁体   English   中英

了解自联接不同查询

[英]Understanding Self-Join Distinct Query

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

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

该查询返回所有与另一名雇员共享姓氏的雇员,但不包括职称或雇员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)上建立索引。

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

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

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

是否有任何经验法则可以从易于理解的描述中构造SQL查询?
自我加入的目的是什么? (用英语)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM