什么是自我加入? (英文)

时间:2016-04-01 09:09:05

标签: sql self-join relational-algebra

我已经知道自我加入的作用了。谢谢,我还阅读了关于堆栈溢出的所有其他计算机化操作描述,所以我知道这实际上不是一个重复的问题,所以请不要给我表或加入列表。

我正在寻找为什么它将被完成(并且请,而不仅仅是自我引用的员工经理示例)。

用简单的英语,我想从自我加入中获得什么?

我的用法是在大学课程中,来自关系代数角度。我已经做了一些SQL几年但教师喜欢在表上进行自联接(在重命名一个或多个字段之后)。不是经常在SQL中完成的事情,所以我想知道他正在尝试执行的操作是什么,但他似乎非常热衷于经常这样做。

我想我会在这里问,因为很多人都要求提供这些信息,但标记为"已经回答"但是所有答案都给出了操作描述而不是"为什么要这样做"。

2 个答案:

答案 0 :(得分:1)

数据库设计器为每个基表提供谓词(通过列名称参数化的句子模板)。

Parent(person, child) -- person PERSON is parent of person CHILD
Likes(person, food) -- person PERSON likes food FOOD

设计关系代数是为了使关系表达式(基表名或操作符调用)的值保存从其谓词中生成真正的命题(语句)的行。

-- person PERSON is parent of person CHILD
Parent

作为对运算符NATURAL JOIN的调用的表达式的谓词是其输入的谓词的AND。

-- 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 条件和列的RENAME&重命名参数。

/*
EXISTS 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 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转换为谓词:点击输入列重命名。 NATURAL / CROSS / INNER JOIN,ON&在哪里给和。每个无点结果列都给出一个AND,它等于它的虚线版本。最后丢弃所有虚线列给出了EXISTS。

-- person PERSON likes food FOOD AND person CHILD likes food FOOD
/*
EXISTS P.*, C.* such that
        P.PERSON = PERSON AND C.person = CHILD AND P.FOOD = 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
WHERE p.food = c.food
    AND p.food = c.food
    AND FOOD = c.food

再次:在SQL中,我们说当JOIN的多个表别名与相同的表值相关联时,存在自连接;在应用程序术语中,这意味着我们可以根据在某些参数/列中不同的谓词来表达查询含义;对于这种情况,应用程序或表的含义没有什么特别之处。

请参阅this re query semantics,其中包含指向this re self-join semantics in particular的链接。

答案 1 :(得分:0)

员工经理的例子之所以如此普遍,是因为它击中了头上的钉子。表上的自联接查找行对,就像任何连接一样,但两行都来自同一个表。没什么特别的。