当前位置: 首页 > 面试题库 >

在SQL中何时需要为表名赋予别名?

宗烨赫
2023-03-14
问题内容

我在用多个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

这样

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

有人可以解释吗?


问题答案:

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

您需要提供一个别名:

  • When the same table name is referenced multiple times

想象两个人有完全相同的约翰·多伊。如果您致电John,双方都会回复您的电话。您不能给两个人使用相同的名字,并假设他们会知道您要呼叫的人。同样,当您给相同的结果集命名为完全相同时,SQL无法识别要从中获取值的结果集。您需要使用不同的名称来区分结果集,以免使SQL引擎感到困惑。

脚本1t1t2 是此处的别名

SELECT      t1.col2
FROM        table1 t1
INNER JOIN  table1 t2
ON          t1.col1 = t2.col1
  • When there is a derived table/sub query output

如果某人没有名字,您可以打电话给他们,并且由于您无法给该人打电话,因此他们不会回复您。同样,当您生成派生表输出或子查询输出时,SQL引擎对此并不了解,也不会调用。因此,您需要为派生的输出命名,以便SQL引擎可以适当地处理该派生的输出。

脚本2t1 是此处的别名。

SELECT col1
FROM
(
    SELECT col1
    FROM   table1
) t1


 类似资料:
  • 问题内容: 有没有一种方法可以给Oracle 11g中的子查询一个别名,例如: 否则,有一种方法可以基于client_ref_id加入两个子查询。我意识到有一个自我连接,但是在我正在自我连接上运行的数据库上可能要花5分钟才能完成(我正在运行的实际查询中有一些额外的逻辑,但是我确定了自我连接是什么引起问题)。各个子查询仅需花费几秒钟即可完成。自联接查询看起来像: 问题答案: 您可以使用Oracle的

  • 让我们考虑下面的PoxGrES查询: 当我删除周围的引号时,查询无法正确响应,但当我删除周围的引号时,查询就不能正确响应了。为什么?在这种情况下,正确的查询编写方法是什么,布尔列周围没有引号,文本列周围没有引号?还有别的吗?

  • 问题内容: 计算在查询中声明的两个临时列名称的sum()-在SQL中 表只有两列。将total和total1作为临时名称给出。 如何计算作为与列名声明为临时名称为查询执行。 使用cte不支持重复的列名吗? 如何利用它来支持重复的列名 问题答案: 您不能直接做到这一点-您需要使用CTE(公用表表达式)之类的东西-像这样: 它在SQL Server 2005和更高版本(以及支持CTE(这是ANSI标准

  • 问题内容: 我刚刚(昨天)学会了使用“存在”而不是“输入”。 我对此有一些疑问: 1)据我所知,解释是: “这样做更好的原因是,将只返回匹配的值,而不是建立大量可能的结果列表” 。这是否意味着虽然第一个子查询可能返回900个结果,但第二个子查询仅返回1(是或否)? 2)过去,我曾在RDBMS中抱怨:“只能检索前1000行”,第二种方法可以解决该问题吗? 3)第二个子查询中别名的范围是什么?…别名仅

  • 通过使用 SQL,可以为表名称或列名称指定别名。 SQL 别名 通过使用 SQL,可以为表名称或列名称指定别名。 基本上,创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法SELECT column_name AS alias_name FROM table_name; 表的 SQL 别名语法SELECT column_name(s) FROM table_name AS alias_n

  • 问题内容: 我尝试使用MySQL: 我得到这个: 注意: 此查询是自动生成的,条件基于表别名。 为什么会出现此错误? 有什么方法可以在where子句中使用表别名? 这是MySQL特有的吗? 问题答案: 您可以这样使用SQL: