3

我认为这是一个 SQL 新手问题,但这里有。

我有一个基于示例用户定义函数的 SQL 查询 (SQL Server 2005):

SELECT 
    CASEID,
    GetNoteText(CASEID)
FROM 
( 
    SELECT 
        CASEID 
    FROM 
        ATTACHMENTS 
    GROUP BY 
        CASEID 
) i
GO 

UDF 效果很好(它连接相关表中多行的数据,如果这很重要的话)但我对 FROM 子句后面的“i”感到困惑。查询与 i 一起工作正常,但没有它就会失败。“我”的意义是什么?

编辑:正如乔尔在下面指出的,它不是关键字

4

7 回答 7

16

在 FROM 子句中使用子查询时,需要为查询命名。由于名称对您来说并不重要,因此通常会选择简单的名称,例如“i”或“a”。但是你可以把任何你想要的名字放在那里——“i”本身没有任何意义,而且它当然不是关键字。

如果您有一个非常复杂的查询,您可能需要将您的子查询与其他查询或表连接起来。在这种情况下,名称变得更加重要,您应该选择更有意义的名称。

于 2008-10-01T14:21:14.157 回答
6

i 命名(子查询),这是必需的,也是进一步连接所必需的。

当连接表之间存在冲突的列名时,您必须在外部查询中使用子查询名称为列添加前缀,例如:

SELECT 
    c.CASEID, c.CASE_NAME,
    a.COUNT AS ATTACHMENTSCOUNT, o.COUNT as OTHERCOUNT,
    dbo.GetNoteText(c.CASEID)
FROM CASES c
LEFT OUTER JOIN
( 
    SELECT 
        CASEID, COUNT(*) AS COUNT
    FROM 
        ATTACHMENTS 
    GROUP BY 
        CASEID 
) a
ON a.CASEID = c.CASEID
LEFT OUTER JOIN
(
    SELECT 
        CASEID, COUNT(*) AS COUNT
    FROM 
        OTHER
    GROUP BY 
        CASEID 
) o
ON o.CASEID = c.CASEID
于 2008-10-01T14:32:12.620 回答
3

“i”为您的 select 语句提供了一个有效的表名。它也可以写成(我想——我不是 MSSQLServer 人)“AS i”。

于 2008-10-01T14:22:27.430 回答
1

正如其他人所说,它是子查询的表名别名。

在子查询之外,您可以使用 i.CASEID 来引用子查询结果。

在这个例子中它不是太有用,但是当你有多个子查询时,它是一个非常重要的消歧工具。

虽然,我会选择一个更好的变量名。甚至“温度”也更好。

于 2008-10-01T14:31:09.237 回答
1

i 命名您的子查询,以便如果您有一个包含大量子查询的复杂查询并且您需要访问字段,您可以以明确的方式这样做。

当您开始编写更长的查询时,最好给您的子查询提供更具描述性的名称,以防止您自己混淆,没有什么比因为您忘记了哪个 i.id 是正确的一个或正在从哪个表/查询 c.name 检索。

于 2008-10-01T14:48:58.040 回答
0

“派生表”是在 FROM 子句中使用子查询的技术术语。

SQL Server 联机丛书语法显示 table_alias 在这种情况下不是可选的;“table_alias”没有括在括号中,根据 Transact-SQL 语法约定,括号中的内容是可选的。关键字“AS”是可选的,因为它被括在括号中......

   派生表 [ AS ] 表别名 [ ( 列别名 [ ,...n ] ) ]

来自(Transact-SQL):http:
//msdn.microsoft.com/en-us/library/ms177634 (SQL.90).aspx

Transact-SQL 语法约定: http:
//msdn.microsoft.com/en-us/library/ms177563 (SQL.90).aspx

于 2008-10-02T02:03:20.163 回答
0

要吸取的教训是考虑将继承您的代码的人。正如其他人所说,如果代码是这样编写的:

SELECT DT1.CASEID, GetNoteText(DT1.CASEID) 
FROM (
   SELECT CASEID 
   FROM ATTACHMENTS
   GROUP BY CASEID
) AS DT1 (CASEID);

那么读者就会有更大的机会弄清楚它,甚至可能会看到暗示“派生表”的“DT1”。

于 2008-10-02T10:42:02.430 回答