代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

具有嵌套联接的表别名规则

  •  2
  • Alexander Mills  · 技术社区  · 7 年前

    我有这个,它似乎是有效的语法:

    SELECT
      A.email,
      A.handle as foo
    FROM
      (
        user_table A
        INNER JOIN (
          klass_table K
          LEFT JOIN user_table B ON (B.x = A.y)
        )
      )
    

    但如果我重复使用别名(user_table A x2):

    SELECT
      A.email,
      A.handle as foo
    FROM
      (
        user_table A
        INNER JOIN (
          klass_table K
          LEFT JOIN user_table A ON (A.x = K.y)
        )
      )
    

    然后我会得到这个错误:

    不是唯一的表/别名:“A”

    有人能解释一下在这种情况下,别名是如何工作的吗?如果是同一个表,为什么需要不同的别名?注意这些都是无意义的查询-我更关心这里的语义/语法规则。

    2 回复  |  直到 7 年前
        1
  •  2
  •   forpas    7 年前

    这:

    SELECT
      A.email,
      A.handle as foo
    FROM
      (
        user_table A
        INNER JOIN (
          klass_table K
          LEFT JOIN user_table B ON (B.x = A.y)
        )
      )
    

    选择两列,但从哪个表或子查询?
    是什么 A
    一个 是的别名 user_table 但它只存在于这个子查询中:

      (
        user_table A
        INNER JOIN (
          klass_table K
          LEFT JOIN user_table B ON (B.x = A.y)
        )
      )
    

      (
        user_table A
        INNER JOIN (
          klass_table K
          LEFT JOIN user_table B ON (B.x = A.y)
        )
      ) A
    

    当然是这个 一个 与上一个不同 .
    一个 是表的别名 用户表 但是 一个 是子查询的别名。

        2
  •  1
  •   Gordon Linoff    7 年前

    WITH A as (
          SELECT *
          FROM user_table 
         )
    SELECT A.email, A.handle as foo
    FROM A INNER JOIN
         klass_table K
         ON . . . LEFT JOIN
         A A2
         ON A2.x = K.y
    

    但是,对同一表或同一表中CTE的多个引用 FROM 子句需要不同的别名。

    推荐文章