我认为这是一种SQL新手问题,但现在就是这样。

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

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

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

编辑:正如乔尔在下面提到的那样,它不是关键字

有帮助吗?

解决方案

在FROM子句中使用子查询时,需要为查询指定名称。由于名称对您来说并不重要,因此通常会选择像“我”或“a”这样简单的名称。但是你可以把任何你想要的名字放在那里 - 对于'我'本身没有任何意义,它肯定不是一个关键词。

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

其他提示

我命名(子查询),这是必需的,并且还需要进一步的连接。

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

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”给你的select语句一个有效的表名。它也可以写成(我认为 - 我不是MSSQLServer人)作为“AS i”。

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

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

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

虽然,我会选择一个更好的变量名称。即使是“温度”也是如此。更好。

我命名你的子查询,这样如果你有一个包含大量子查询的复杂查询,你需要访问这些字段,你可以明确地这样做。

优良作法是为您的子查询提供更具描述性的名称,以防止您在开始编写更长的查询时产生混淆,没有什么比通过长sql语句向上滚动更糟糕的了,因为您忘记了哪一个。 id是正确的,或者是从哪个表/查询c.name中检索。

要学到的经验教训是考虑将继承您的代码的人。正如其他人所说,如果代码是这样写的:

SELECT DT1.CASEID, GetNoteText(DT1.CASEID) 
FROM (
   SELECT CASEID 
   FROM ATTACHMENTS
   GROUP BY CASEID
) AS DT1 (CASEID);
然后,读者可能已经把它想出来的可能性增加,甚至可能会接受“DT1”,暗指“派生表”。

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

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

    derived_table [AS] table_alias [(column_alias [,... n])]

FROM(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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top