了解自连接 Distinct 查询
Understanding Self-Join Distinct Query
我不确定此查询如何处理来自 EMPLOYEE A 和 EMPLOYEE B 的查询。我知道 distinct 会删除重复值,但如果您只选择 A.EMPLOYEE_ID、[=14=,为什么会有两个表], 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
此查询 returns 所有与另一名员工同姓但没有头衔或员工 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)
上建立索引。
返回的行不是 table 的限制和投影,它们是连接和限制后留下的行的投影。它们是 table 中行的列,但在 table 中的行之间也有某些匹配项。这恰好是所有行的限制和投影中的行,这些行可以由 table 中的一行与 table 中的一行配对组成——这就是逗号的乘积(交叉连接)给。 (可以改用显式交叉连接或内部连接。)
返回的行是针对存在另一名具有相同姓氏但 ID 和职位不同的员工的员工。
仍然--为什么要写那个特定的查询表达式?查询要求满足某些条件的行。每个基 table 是满足某些条件的行。每个关系运算符 & SQL 子表达式计算满足标准的行,该标准是其参数 table 的标准的特定转换。 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?
我不确定此查询如何处理来自 EMPLOYEE A 和 EMPLOYEE B 的查询。我知道 distinct 会删除重复值,但如果您只选择 A.EMPLOYEE_ID、[=14=,为什么会有两个表], 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
此查询 returns 所有与另一名员工同姓但没有头衔或员工 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)
上建立索引。
返回的行不是 table 的限制和投影,它们是连接和限制后留下的行的投影。它们是 table 中行的列,但在 table 中的行之间也有某些匹配项。这恰好是所有行的限制和投影中的行,这些行可以由 table 中的一行与 table 中的一行配对组成——这就是逗号的乘积(交叉连接)给。 (可以改用显式交叉连接或内部连接。)
返回的行是针对存在另一名具有相同姓氏但 ID 和职位不同的员工的员工。
仍然--为什么要写那个特定的查询表达式?查询要求满足某些条件的行。每个基 table 是满足某些条件的行。每个关系运算符 & SQL 子表达式计算满足标准的行,该标准是其参数 table 的标准的特定转换。 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?