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

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

  1. 是否有严格的自加入格式?有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 中却很快,这让我感到困惑。

【问题讨论】:

    标签: sql postgresql sqlite query-optimization


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2010-12-31
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多