什么是自连接? (用英语)
What is a self join for? (in english)
我已经知道自联接的作用了。谢谢,我还阅读了所有其他关于堆栈溢出的计算机化操作描述,所以我知道这实际上不是一个重复的问题,所以请不要给我表格或加入列表。
我正在寻求 为什么 它会被完成(请不要只是自我引用的员工经理 示例 ) .
用简单的英语来说,我想通过自连接实现什么目标?
我的用法是在大学课程中,来自关系代数的角度。我做了一些 SQL 几年了,但讲师喜欢在表上进行自连接(在重命名一个或多个字段之后)。在 SQL 中不常做的事情,所以我想知道他正在尝试执行的操作是什么,但他似乎非常热衷于经常这样做。
我想我会在这里问,因为很多其他人都要求提供此信息但被标记为 "already answered" 但所有答案都给出了 操作性 描述而不是 "why is this being done".
员工-经理示例之所以如此普遍,是因为它一语中的。 table 上的自联接查找行对,就像任何联接一样,但两行都来自同一个 table。真的没什么特别的。
数据库设计者给每个基table一个谓词(由列名参数化的句子模板)。
Parent(person, child) -- person PERSON is parent of person CHILD
Likes(person, food) -- person PERSON likes food FOOD
关系代数的设计使得关系表达式(基本 table 名称或运算符调用)的值包含构成真实 命题(陈述)的行从它的谓词。
/* (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 & EXISTS other column、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))
因此每个查询表达式的值都包含使其谓词成为真语句的行。
假设我们将 table 的代数自连接定义为两个 table 的自然连接,这些 table 是通过零个或多个重命名序列从原始文件中获得的。根据上面的内容,我们对满足谓词 AND 的行进行 NATURAL JOIN。 当我们希望满足通过仅在 parameters/columns.
中不同的谓词表示的结果谓词的行时,就会出现自连接
/* (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 table 列的第一个通过前缀 table 别名(相关名称)和一个点进行重命名。 (SQL 自然连接 不 点公共列。)新的 table 是自然连接的。 ON 和 WHERE RESTRICT 每个条件。然后 SELECT DISTINCT 子句 RENAMES 从返回的列中删除点并 PROJECTS 去掉不需要的虚线列。
我们可以将 SQL 直接转换为谓词:点输入列重命名。 NATURAL/CROSS/INNER JOIN,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 的多个 table 别名与相同的 table 值关联时,我们说存在自连接;在应用程序术语中,这意味着我们可以根据某些 parameters/columns 不同的谓词来表达查询含义;应用程序或 table 的含义并没有什么特别之处。
参见 which happens to include a link to this re self-join semantics in particular。
我已经知道自联接的作用了。谢谢,我还阅读了所有其他关于堆栈溢出的计算机化操作描述,所以我知道这实际上不是一个重复的问题,所以请不要给我表格或加入列表。
我正在寻求 为什么 它会被完成(请不要只是自我引用的员工经理 示例 ) .
用简单的英语来说,我想通过自连接实现什么目标?
我的用法是在大学课程中,来自关系代数的角度。我做了一些 SQL 几年了,但讲师喜欢在表上进行自连接(在重命名一个或多个字段之后)。在 SQL 中不常做的事情,所以我想知道他正在尝试执行的操作是什么,但他似乎非常热衷于经常这样做。
我想我会在这里问,因为很多其他人都要求提供此信息但被标记为 "already answered" 但所有答案都给出了 操作性 描述而不是 "why is this being done".
员工-经理示例之所以如此普遍,是因为它一语中的。 table 上的自联接查找行对,就像任何联接一样,但两行都来自同一个 table。真的没什么特别的。
数据库设计者给每个基table一个谓词(由列名参数化的句子模板)。
Parent(person, child) -- person PERSON is parent of person CHILD
Likes(person, food) -- person PERSON likes food FOOD
关系代数的设计使得关系表达式(基本 table 名称或运算符调用)的值包含构成真实 命题(陈述)的行从它的谓词。
/* (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 & EXISTS other column、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))
因此每个查询表达式的值都包含使其谓词成为真语句的行。
假设我们将 table 的代数自连接定义为两个 table 的自然连接,这些 table 是通过零个或多个重命名序列从原始文件中获得的。根据上面的内容,我们对满足谓词 AND 的行进行 NATURAL JOIN。 当我们希望满足通过仅在 parameters/columns.
中不同的谓词表示的结果谓词的行时,就会出现自连接/* (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 table 列的第一个通过前缀 table 别名(相关名称)和一个点进行重命名。 (SQL 自然连接 不 点公共列。)新的 table 是自然连接的。 ON 和 WHERE RESTRICT 每个条件。然后 SELECT DISTINCT 子句 RENAMES 从返回的列中删除点并 PROJECTS 去掉不需要的虚线列。
我们可以将 SQL 直接转换为谓词:点输入列重命名。 NATURAL/CROSS/INNER JOIN,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 的多个 table 别名与相同的 table 值关联时,我们说存在自连接;在应用程序术语中,这意味着我们可以根据某些 parameters/columns 不同的谓词来表达查询含义;应用程序或 table 的含义并没有什么特别之处。
参见