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:t1和t2是别名
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)
唯一需要提供别名的时候是多次引用表时以及何时有派生输出(子查询充当表)(感谢捕获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%确定地说您要使用哪个版本的购买.如果它必须在两个相同的选择之间猜测,那么它总是会抛出一个错误,要求你更明确.