SQL连接查询结果表作别名

3
有没有一种方法可以给联接的结果表分配别名?
查询示例:
SELECT *
FROM t1
JOIN t2
ON t1.num = t2.num
AS result;
3个回答

8

是的!

select result.* 
from (SELECT *
    FROM t1
    JOIN t2
    ON t1.num = t2.num) result

在涉及到内部表的相同列名时,你需要注意,否则你会在结果表中得到一个模棱两可的列错误。建议不要使用 select *,而是挑选出你需要的列。


我不熟悉 result.*,那是什么? - Robert
这是您对“table”的别名,您在t1和t2上进行连接。它可以是任何您喜欢的东西。因此,您可以在括号后面命名别名,然后在选择或任何进一步的连接中引用它。 - LordBaconPants
啊,所以 select * 的意思是“从所有表中给我所有的东西”,而 select results.* 的意思是“从结果表/别名中给我所有的东西”。你可以选择 t1.*,t2.*,然后它会把它们带回来。如果你有很多连接但只想查看主要表并忽略其余部分,这非常方便。 - LordBaconPants
在您上面的示例中,选择*将带回相同的数据,这只是为了演示您可以通过别名引用它/将其视为表。 - LordBaconPants
我在MySQL 5.6上尝试执行以下语句:"select c.* from (select * from o join p on o.id=p.id) as c",但报错显示“重复的列名'id'”。为什么会这样? - Scott Chu
因为O和P有一个列具有相同的名称,至少是“id”。我建议在子查询中只选择您感兴趣的列:select c.* from (select o.goose, o.id, p.donkey from o join p on o.id=p.id) as c - LordBaconPants

2
你可以将其作为表达式(子查询)并给其一个别名,但在你的简单示例中,我看不出它可能带来什么好处。 我假设你将在更复杂的查询中使用它。
SELECT *
FROM (
    SELECT t1.id, t1.name, t2.category, t2.subcategory
    FROM t1
    INNER JOIN t2 ON t1.id=t2.id
) AS result
LEFT JOIN t3 ON result.id=t3.id

0
SELECT result.* FROM 
(SELECT *
FROM t1
JOIN t2
ON t1.num = t2.num) AS result;

我不熟悉 result.*,那是什么? - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接