为什么我需要使用" as"这个SQL查询中的关键字?

时间:2016-08-29 13:49:41

标签: sql-server tsql

我有这个SQL查询:

select top(1) 
    salary 
from 
    (select top(2) salary 
     from employee 
     order by salary desc) as b 
order by 
    salary asc

如果我不使用as b,则会给我一个错误:

  

......附近的语法不正确

为什么在此查询中必须使用as

6 个答案:

答案 0 :(得分:4)

您不需要as关键字。实际上,我建议使用as作为列别名但不使用表别名。所以,我会把它写成:

select top(1) salary
from (select top(2) salary 
      from employee 
      order by salary desc
     ) b
order by salary asc;

您确实需要子查询的表别名,因为SQL Server要求命名from子句中的所有子查询。

答案 1 :(得分:3)

这是TSql语法。 FROM中的子查询必须具有别名,即使它从未使用过。例如,Oracle认为此别名是可选的。

答案 2 :(得分:2)

这是因为您有一个子查询,根据the Transact-SQL documentation on FROM,使用别名是强制性的:

  

当使用派生表,行集或表值函数或运算符子句(例如PIVOTUNPIVOT)时,必需 table_alias < / em>在子句的末尾是所有列的关联表名,包括返回的分组列。

请注意,使用派生表,您可以在SQL语句中使用这种子查询:

  

derived_table
  是一个从数据库中检索行的子查询。 derived_table 用作外部查询的输入。

答案 3 :(得分:1)

因为你正在使用&#39; salary&#39;两次。如果没有别名,口译员就不会知道什么是“薪水”。订购结果。通过使用别名,它可以在employee.salary和b.salary之间进行辨别。

答案 4 :(得分:0)

您正在创建两个查询。第一个从员工中选择前2名工资。您正在呼叫此列表&#34; b&#34;。然后,您将从&#34; b&#34;。

中选择最高薪水

答案 5 :(得分:0)

获得第二高薪的另一种方法......好像你需要第三或第四的方法会变得更具挑战性......

SELECT * 
FROM (SELECT salary, row_number() over (order by salary desc)  rn
      FROM  employee) E
WHERE rn = 2