数据库设计者给每个基表一个谓词(由列名参数化的句子模板)。
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 列 & EXISTS 其他列、RESTRICT 条件 & AND 条件和列的重命名和参数的重命名。
/* (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))
因此,每个查询表达式的值都包含使其谓词成为真实语句的行。
假设我们将表的代数自连接定义为通过零个或多个重命名序列从原始表中获得的两个表的 NATURAL JOIN。如上所述,我们对满足谓词 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 子句重命名以从返回的列中删除点并 PROJECTS 去除不需要的点列。
我们可以直接将 SQL 转换为谓词:点输入列重命名。 NATURAL/CROSS/INNER JOIN, ON & WHERE give 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 query semantics,其中恰好包含指向 this re self-join semantics in particular 的链接。