我已经知道自连接的作用了。谢谢,我还阅读了有关堆栈溢出的所有其他计算机化操作描述,所以我知道这实际上不是重复的问题,所以请不要给我表格或连接列表。
我正在寻求什么为什么会这样做(请不要只是自我引用的员工经理示例)。
用简单的英语来说,我希望通过自加入实现什么目标?
我的用法是在大学课程中,来自关系代数的角度。我已经做了几年 SQL,但讲师喜欢在表上进行自连接(在重命名一个或多个字段之后)。这在 SQL 中并不常见,所以我想知道他试图执行的操作是什么,但他似乎非常热衷于频繁执行此操作。
我想我应该在这里问,因为许多其他人都要求提供此信息,但被标记为“已回答”,但所有答案都给出了操作描述,而不是“为什么要这样做”。
员工-经理的例子之所以如此常见,是因为它一语中的。表上的自联接会查找行对,就像任何联接一样,但两行都来自同一个表。其实没什么特别的。
数据库设计者给每个基表一个谓词(由列名参数化的句子模板)。
Parent(person, child) -- person PERSON is parent of person CHILD
Likes(person, food) -- person PERSON likes food FOOD
关系代数的设计使得关系表达式的值(基表名称或运算符调用)包含从其谓词构成真实命题(陈述)的行。
/* (PERSON, CHILD) rows where
person PERSON is parent of person CHILD
*/
Parent
调用运算符 NATURAL JOIN 的表达式的谓词是其输入谓词的 AND。
/* (PERSON, CHILD, FOOD) rows where
person PERSON is parent of person CHILD AND person PERSON likes food FOOD
*/
Parent NATURAL JOIN Likes
UNION & OR、MINUS & AND NOT、PROJECT column(s) & EXISTS other columns、RESTRICT condition & AND condition 以及 RENAME 列和重命名参数也是如此。
/* (CHILD, FOOD) rows where
there EXISTS a value for PERSON such that
person PERSON is parent of person CHILD AND person CHILD likes food FOOD
*/
PROJECT child, food (Parent NATURAL JOIN (RENAME person:=child Likes))
因此,每个查询表达式的值都保存使其谓词成为 true 语句的行。
假设我们将表的代数自联接定义为通过零次或多次重命名序列从原始表获得的两个表的自然联接。根据上面的内容,我们对满足谓词 AND 的行进行 NATURAL JOIN。 当我们想要满足通过多次使用仅参数/列不同的谓词来表达的结果谓词的行时,就会出现自连接。
/* (PERSON, FOOD, CHILD) rows where
person PERSON likes food FOOD AND person CHILD likes food FOOD
*/
Likes NATURAL JOIN (RENAME person:=child Likes)
除此之外,给定应用程序中的给定查询中出现的自连接没有什么特别的。
SQL SELECT DISTINCT 语句可以通过代数运算符来描述。他们还计算查询谓词。第一个 FROM 表列通过添加表别名(相关名称)和点作为前缀来重命名。 (SQL NATURAL JOIN点公共列。)新表是 NATURAL JOINed。 ON 和 WHERE RESTRICT 根据条件。然后 SELECT DISTINCT 子句 RENAMES 从返回的列中删除点并投影掉不需要的点列。 我们可以直接将SQL转换为谓词:点输入列重命名。自然/交叉/内部连接,ON & WHERE 给出 AND。每个无点结果列都会给出一个 AND,表示它等于其点版本。最后删除所有虚线列给出 EXISTS。
/* same as above */
/* (PERSON, FOOD, CHILD) rows where
there EXISTS values for P.* & C.* such that
PERSON = P.PERSON AND CHILD = C.person AND FOOD = P.FOOD
AND person P.CHILD likes food P.FOOD
AND person C.CHILD likes food C.FOOD
AND P.FOOD = C.FOOD
*/
SELECT DISTINCT p.person AS person, c.person AS child, p.food AS food
FROM Likes p INNER JOIN Likes c
ON p.food = c.food
再次强调:在 SQL 中,当 JOIN 的多个表别名与同一个表值关联时,我们说存在自连接;在应用程序术语中,这意味着我们可以用某些参数/列不同的谓词来表达查询含义;出现这种情况的应用程序或表格含义没有什么特别的。
参见
,其中恰好包含指向 this re 自连接语义 的链接。