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

时间:2019-02-17 21:07:26

标签: sql postgresql sql-alias

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

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 个答案:

答案 0 :(得分:2)

此:

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)
    )
  )

选择2列,但是从哪个表或子查询中选择?
什么是A
Auser_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

当然,此A与先前的A不同。
第一个A是表user_table的别名,但 第二个A是子查询的别名。

答案 1 :(得分:1)

是正确的。如果要重复使用别名,请使用CTE:

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

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