【问题标题】:What is a self join for? (in english)什么是自我加入? (用英语)
【发布时间】:2016-07-21 00:29:50
【问题描述】:

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

我正在寻找的为什么会这样做(请不要只是自我引用的员工经理示例)。

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

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

我想我会在这里问,因为许多其他人都要求提供此信息但被标记为“已回答”,但所有答案都给出了操作描述而不是“为什么要这样做” .

【问题讨论】:

    标签: sql self-join relational-algebra


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复,但我认为您错过了我要问的内容。员工经理确实准确地击中了那个特别的钉子;从关系代数的角度讲,它是一种非常特殊的自我引用行为。这就是为什么我在回复中专门排除它。从表面上看,自联接 [自然,因为我们谈论的是关系代数,而不是 SQL] 似乎“没什么特别的”,所以 为什么 这样做?我在想:Query1 = tableX ⋈ ? col1↦col1, col2↦col2 (tableX) Query2 = σ col1 = col1 ` (σ col2 = col2'(Query1)) 将“返回 tableX 中唯一行的完整列表”
    • 哦,我想我一点也不特别。每当相同类型的两个对象相关时,它就会一直发生。银行账户,储蓄和支票?但是您似乎错过了连接几乎总是跨列的。这不是因为单个列上的自联接返回表 - 它通常不会。它可以返回更多的行。考虑在性别相同的人员表上进行自联接。它将返回每对可能的男性每对可能的女性。定义明确但很少需要。
    • 对不起,你还在讨论员工经理的事情(“特别”)。还是你在回答我问的问题?如果你是你的答案很混乱。到目前为止,从我自己的研究来看,我的答案似乎是“在所有相关项目上创建双重条目”......因此设置为删除真正的重复项(在 上选择重命名字段)所以要留下真正的实例,它们是共同行的多个案例。可以将其删除为单次,或预计显示再次出现。
    • @mist42nz:除了回答的第一句话之外,我在谈论一般情况。 “删除重复项”只是您进行自联接的一个示例。从我的第二句话中可以清楚地看出这一点:自联接查找任何一对行。 (我认为您称其为“双重输入”)。重复删除'是您需要此类对的特定情况:您打算删除每对中的两行之一。
    • 谢谢,这更符合我的要求。因此,自连接(关系代数)有助于:自引用案例(员工经理),重复删除(通过删除自配对的行)。该行后面的任何其他特别有用的操作。这意味着我现在可以用通俗的语言与人们交谈并说“进行重复删除的一种方法是首先进行自我加入”。因此,它变成了一个英文讨论(或伪代码入口),这正是我正在寻找的。再次感谢您!
    【解决方案2】:

    数据库设计者给每个基表一个谓词(由列名参数化的句子模板)。

    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 的链接。

    【讨论】:

    • 感谢您抽出宝贵时间。但请下次正确阅读问题。网上有很多关于 SQL 甚至关系代数的回复,甚至在 Stackoverflow 上也有关于自联接机制的回复。你完全和完全没有做的是对它的作用给出一个英文描述(即你为什么要进行自我加入),这就是问题的全部意义所在。 IIRC 通过重命名一个或多个字段;并使用自联接通过冗余匹配和删除其他字段,自联接允许在表中搜索重复、重叠和多重性。
    • 这个答案从业务/应用程序的推理角度准确地解释了“为什么要进行自联接”:“当我们想要满足仅在参数上不同的谓词的行时 [of句子模板]”。您要求“避开 SQL 就是一切想法并处理所涉及的逻辑”。逻辑根据定义是谓词的操作。这个答案与代数和 SQL 唯一有关的是它告诉您如何将有关业务/业务的英语语句转换为它们。它说明了连接和重命名出现的原因和时间。
    • 您的 cmets 并不反映对我所写内容的理解。然后我谈论业务逻辑,因为问题询问如何导致代数/SQL 内连接,我还讨论了如何导致内连接。我显然不会将代数或 SQL 用于业务逻辑,我使用英语。形式逻辑是英语的一个子集,是工程(包括软件工程)和科学(包括计算机科学)中精确的语言。你忽略了我使用“谓词”(它概括了 SQL 的使用)作为使用事物名称的语句,没有它就不可能进行通信。
    • philip,我们为什么要将数据放入表格中。
    • 因为“每个命名表都有一个谓词(由列名参数化的句子模板)。”和“作为表名的表达式的值包含从其谓词中构成真实命题(陈述)的行。”您只需举出任何示例即可看到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2019-02-23
    • 2021-06-07
    • 2011-11-03
    相关资源
    最近更新 更多