什么时候需要在SQL中为表名提供别名?

tim*_*son 6 sql alias join table-alias

我注意到在使用多个JOIN进行查询时,我的查询不起作用,除非我给其中一个表名别名.

这是一个简单的例子来解释这一点:

不起作用:

SELECT subject
from items
join purchases on items.folder_id=purchases.item_id
join purchases on items.date=purchases.purchase_date
group by folder_id
Run Code Online (Sandbox Code Playgroud)

这样:

SELECT subject
from items
join purchases on items.folder_id=purchases.item_id
join purchases as p on items.date=p.purchase_date
group by folder_id
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

小智 6

您在查询中使用相同的表购买两次.您需要通过提供不同的名称来区分它们.

你需要给一个别名:

  • When the same table name is referenced multiple times

想象一下,两个人拥有完全相同的John Doe.如果你打电话给John,他们都会回应你的电话.你不能给两个人同名,并假设他们会知道你在跟谁打电话.类似地,当您为相同的结果集提供完全相同的结果集时,SQL无法识别从中获取值的结果集.您需要提供不同的名称来区分结果集,以便SQL引擎不会混淆.

脚本1:t1t2是别名

SELECT      t1.col2
FROM        table1 t1
INNER JOIN  table1 t2
ON          t1.col1 = t2.col1
Run Code Online (Sandbox Code Playgroud)
  • When there is a derived table/sub query output

如果某人没有姓名,您可以打电话给他们,因为您不能打电话给他,他们不会回复您.类似地,当您生成派生表输出或子查询输出时,它是SQL引擎未知的东西,它不会调用什么.因此,您需要为派生输出命名,以便SQL引擎可以适当地处理派生的输出.

脚本2:t1是此处的别名.

SELECT col1
FROM
(
    SELECT col1
    FROM   table1
) t1
Run Code Online (Sandbox Code Playgroud)


Jus*_*ony 5

唯一需要提供别名的时候是多次引用表时以及何时有派生输出(子查询充当表)(感谢捕获Siva).这样您就可以消除在其他查询中使用哪个表引用之间的歧义.

进一步详细说明,在您的示例中:

SELECT subject
from items
join purchases on items.folder_id=purchases.item_id
join purchases on items.date=purchases.purchase_date
group by folder_id
Run Code Online (Sandbox Code Playgroud)

我的假设是你觉得每个join及其相应的on将使用相关表,但是你可以使用你想要的任何表引用.所以,当你说on items.date=purchases.purchase_date,SQL引擎对于你是指第一个购买表还是第二个购买表感到困惑.

通过添加别名,您现在可以通过更明确地消除歧义.SQL引擎现在可以100%确定地说您要使用哪个版本的购买.如果它必须在两个相同的选择之间猜测,那么它总是会抛出一个错误,要求你更明确.