SQL语句中不熟悉的字符

时间:2020-03-06 14:58:40  来源:igfitidea点击:

我认为这是一种SQL新手问题,但这是可行的。

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

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

UDF的效果很好(如果有关系,它可以将相关表中多行的数据连接起来),但是我对FROM子句后面的" i"感到困惑。该查询在i上可以正常使用,但在没有它的情况下将失败。 " i"的含义是什么?

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

解决方案

在FROM子句中使用子查询时,需要给查询起一个名字。由于名称实际上对我们而言并不重要,因此通常会选择诸如" i"或者" a"之类的简单名称。但是我们可以在其中输入任何我们想要的名称,就其本身而言," i"完全没有意义,而且它当然不是关键字。

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

" i"为select语句提供有效的表名。也可以将其写为" AS i"(我想我不是MSSQLServer专家)。

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

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

在此示例中,它并不是很有用,但是当我们有多个子查询时,它是一个非常重要的消歧工具。

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

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

i为子查询命名,这样,如果我们有一个包含众多子查询的复杂查询,并且需要访问字段,则可以使用明确的方式进行操作。

优良作法是在开始编写较长的查询时为子查询提供更多的描述性名称,以防止出现混乱,没有什么比这更糟糕的了,而是不得不向上滚动一个较长的sql语句,因为我们已经忘记了哪个i.id是右一个或者正在从中检索哪个表/查询c.name。

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

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

派生表[AS] table_alias [(column_alias [,... n])]

FROM(Transact-SQL):
http://msdn.microsoft.com/zh-CN/library/ms177634(SQL.90).aspx

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

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

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

则读者可能会发现它的机会增加,甚至可能会提到" DT1"并暗示"衍生表"。