【问题标题】:Understanding Self-Join Distinct Query了解自联接不同查询
【发布时间】:2018-11-04 09:07:46
【问题描述】:

我不确定这个查询对于 from EMPLOYEE A 和 EMPLOYEE B 是如何工作的。我知道 distinct 会删除重复的值,但是如果您只选择 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

【问题讨论】:

  • 您的问题似乎与查询的意图有关,而不是技术问题。您需要询问查询的作者或参考它似乎满足的任何要求。 DISTINCT 或任何 SELECT 不必使用所有引用的表或列,如果这是您所要求的。
  • 嗨。谷歌搜索怎么没有回答这个问题?--您已经知道“自加入”这个词。答案如何不只是重复 SQL SELECT 语句的定义?编辑以清楚地证明您声称没有区别 - 如果您没有发现缺陷,请向我们展示并询问我们。返回的行不是一个表的限制和投影,它们是连接和限制之后剩下的行的投影。它们表中行的投影在表中的行之间也具有某些匹配。在链接中查看我的回答,以描述返回的行与您期望的任何行。

标签: sql self-join


【解决方案1】:

此查询返回与其他员工姓氏相同的所有员工,但不返回头衔或员工 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) 上建立索引。

【讨论】:

    【解决方案2】:

    返回的行不是一个表的限制和投影,它们是连接和限制后剩下的行的投影。它们是来自表中行的列,但在表中的行之间也具有某些匹配项。这恰好是所有行的限制和投影中的行,这些行可以由表中的一行与表中的一行配对 - 这是逗号的产品(交叉连接)给出的。 (可以改用显式交叉连接或内连接。)

    返回的行是针对存在另一个姓氏相同但 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多