我有这个,它似乎是有效的语法:
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”
在这种情况下,谁能解释别名的工作原理?如果是同一张表,为什么它需要不同的别名?请注意,这些都是无意义的查询-我在这里更关注语义/语法规则。
答案 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
?
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
当然,此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的多个引用需要不同的别名。