【问题标题】:Unfamiliar character in SQL statementSQL 语句中的不熟悉字符
【发布时间】:2010-09-14 13:02:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: sql sql-server tsql derived-table


    【解决方案1】:

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

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

    【讨论】:

    • 啊,所以这迫使子选择被视为临时表。如果是真的,也许你可以在你的回答中注意到这一点)
    • 从命名的角度来看是的。从查询优化的角度来看不是。别名对优化器如何解析查询没有影响。
    • 只是指出,在 MS-SQL 领域,我们将 FROM 或 JOIN 子句中的子查询称为派生表。通常,当我们引用子查询时 - 它是一个标量或相关子查询。
    • @Mark Brackett:希望我能支持您的评论。完全同意术语的选择。
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          当您开始编写更长的查询时,最好给您的子查询提供更具描述性的名称,以防止您自己混淆,没有什么比因为您忘记了哪个 i 而不得不向上滚动一条长的 sql 语句更糟糕的了。 id 是正确的,或者是从中检索 c.name 的表/查询。

          【讨论】:

            【解决方案6】:

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

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

            那么,读者发现它的机会就会增加,甚至可能会看到“DT1”暗指“派生表”。

            【讨论】:

              【解决方案7】:

              “派生表”是在 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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-07-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-13
                • 2017-08-03
                相关资源
                最近更新 更多