什么是sef-join?

时间:2014-02-19 21:20:52

标签: sql postgresql sqlite query-optimization

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

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

    SELECT a.column_name, b.column_name...
    FROM table1 a, table1 b
    WHERE a.common_field = b.common_field;
    
  2. 但有样本:

        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中很快让我感到困惑。

2 个答案:

答案 0 :(得分:2)

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

您应该放弃使用逗号分隔的表列表的已弃用语法并使用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 < 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

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