我有这个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
?
答案 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
,使用别名是强制性的:
当使用派生表,行集或表值函数或运算符子句(例如
PIVOT
或UNPIVOT
)时,必需 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