什么是真正的 sef-join?

Posted

技术标签:

【中文标题】什么是真正的 sef-join?【英文标题】:What is actually sef-join? 【发布时间】:2014-02-19 21:20:52 【问题描述】:

我有几个关于自我加入的问题,有人可以帮忙回答吗?

    是否有严格的自加入格式?有sample这样的:

    SELECT a.column_name, b.column_name...
    FROM table1 a, table1 b
    WHERE a.common_field = b.common_field;
    

但是有这样的示例:

    SELECT  a.ID, b.NAME, a.SALARY
    FROM CUSTOMERS a, CUSTOMERS b
    WHERE a.SALARY < b.SALARY;

我想知道连接 (a.common_field = b.common_field) 是否必要?因为这两种格式都是自加入的。

如何优化自联接?它们会被视为 INNER JOIN 还是 CROSS JOIN?特别是对于第二种格式,它是 SELF CROSS JOIN 吗?在 SQLite 和 PostgreSQL 中,它们的处理方式是否相同?

我的问题是我想从一堆类似图形的数据中提取一个结构,而我的查询就像

    SELECT A.colum, B.colum,....N.colum
    FROM 
    table1 as A,  table1 as B, table1 as C .... table2 as M, table2 as N .... 
    where 
    A.colum1<B.colum1 and 
    C.colum1=D.colum1 and 
    ....

在查询中,table1,table2... 是单列表,它们是最终结构的组成部分。我的问题在这种自加入格式中是最好的吗?我发现它在 PostgreSQL 中非常慢,但在 SQLite 中却很快,这让我感到困惑。

【问题讨论】:

【参考方案1】:

就结构/行为而言,自联接与任何其他联接没有什么不同,但它们通常以不同的方式使用。

您应该放弃不推荐使用的逗号分隔表列表语法,并使用 ANSI 连接:

SELECT a.column_name, b.column_name...
FROM table1 a
JOIN table1 b
 ON a.common_field = b.common_field;

您可以指定您想要的JOIN 的类型(JOINLEFT JOINRIGHT JOINCROSS JOIN..),以及您希望如何将表格相互关联,只需像任何其他加入一样。正如您在 a.Salary &lt; b.Salary 示例中所指出的那样,不需要等效性。

【讨论】:

不需要为两个表使用相同的列,视情况而定。看我的例子。 对于我的第二种格式,是 SELF-CROSS-JOIN 吗?好像是这样,当有很多表时,计算会变得非常复杂。我有一个类似的例子,它在 SQLite 中运行很快,但在 PostgreSQL 中很慢。 @user3329081 你可以这样想,对我来说CROSS JOIN 意味着无限的关系,一个完整的笛卡尔积,在那个例子中,你不是将每条记录连接到每条记录,但是你得到部分交叉产品。【参考方案2】:

不,没有这样的事情。

自联接只是将表与自身联接的一种特殊情况。把它想象成加入同一事物的两个实例(事实上不是使用两个实例,而是两个引用)

一般情况下,您不能进行内部自连接,但您可以使用自身进行交叉连接或外连接。

例子:

select * from tbPeople p0
join tbPeople p1 on p1.id = p0.parentId
where p0.id = you

返回你和你的父母

select * from tbPeople p0
left join tbPeople p1 on p1.parentId = p0.id
where p0.id = you

返回你的孩子,或者只有你,以防你还没有后代

【讨论】:

以上是关于什么是真正的 sef-join?的主要内容,如果未能解决你的问题,请参考以下文章

什么是“真正的”编程语言? [关闭]

什么是真正的知识

什么是真正的程序员

什么是真正的产品思维

什么是真正的分享?

到底ABR与ASBR的真正区别是啥