什么是真正的 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
的类型(JOIN
、LEFT JOIN
、RIGHT JOIN
、CROSS JOIN
..),以及您希望如何将表格相互关联,只需像任何其他加入一样。正如您在 a.Salary < 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?的主要内容,如果未能解决你的问题,请参考以下文章