1

我有一个存储过程:

CREATE PROCEDURE [dbo].[spGetEmployeesNotInSkill]
AS
BEGIN
SELECT COUNT (*) as Total FROM
(
   SELECT tblUser.EmployeeID FROM tblUser where tblUser.FirstName <> 'guest'
   EXCEPT
   SELECT tblSkillMetrics.EmployeeID FROM tblSkillMetrics
) r -- why is 'r' used here?
END

我想知道的是我们为什么要使用它r?如果我们将其更改r为任何其他字母“a/b/c/...x/y/z”,它会给出正确的输出,但如果我们删除它会显示错误。谁能给我解释一下?

4

4 回答 4

3

每当您引入子查询、CTE 或任何其他将提供行作为查询的一部分的东西时,您都需要提供一个名称,通过该名称可以在查询的其他地方引用该特定行集。

在表或视图的情况下,别名的引入是可选的,如果省略,则使用表或视图的名称。但对于其他任何事情,必须明确提供名称。

例如,您可能拥有:

SELECT COUNT (*) as Total FROM (
SELECT tblUser.EmployeeID FROM tblUser u where u.FirstName <> 'guest'
EXCEPT
SELECT tblSkillMetrics.EmployeeID FROM tblSkillMetrics)r

我现在在内部查询中引入了别名( u) 。tblUser因此,在您的查询中,r是用于整个子查询的名称/别名。

于 2013-07-16T13:23:23.740 回答
1

r用作表别名。查询是说“选择我要调用的这个表中的记录数r”。因此,您可以将其称为任何您喜欢的名称。

当您从这样的虚拟表中进行选择时,您必须给它一个别名 - 将其称为类似的名称可能会更有帮助,SkilledUsers但由于它仅在一个地方使用,因此仅使用单个字符是很常见的。

于 2013-07-16T13:21:17.077 回答
1

这是 SQL 的 SQL Server 实现的一个怪癖。“r”是子查询的别名:SQL Server 要求它必须被命名,即使它没有被引用。您可以轻松地将其命名为 FOO 或 SUBQUERY 或 EMPLOYEES。

SQL 的其他实现不强加这种语法限制。

于 2013-07-16T13:21:25.120 回答
1

我们r用作表别名。当您使用时,您正在为表select * from (select cn from table_name) r分配名称。当您使用连接时,这将很有用。rderived(select cn from table_name)

于 2013-07-16T13:27:02.160 回答