我有几个关于自我加入的问题,有人可以帮忙解答吗?
是否有严格的自我加入格式?有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中很快让我感到困惑。
答案 0 :(得分:2)
就结构/行为而言,自连接与任何其他连接没有什么不同,但它们通常以不同的方式使用。
您应该放弃使用逗号分隔的表列表的已弃用语法并使用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
示例中所指出的那样,不需要等效性。
答案 1 :(得分:0)
不,没有这样的事情。
自联接只是将表连接到自身的特殊情况。把它想象成加入同一事物的两个实例(实际上没有使用两个实例但只有两个引用)
一般情况下,你内心自我加入,但你可以交叉加入或超级加入一个表格。
示例:
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
返回你的孩子,或者只是你还没有后代