代码之家  ›  专栏  ›  技术社区  ›  cori

SQL语句中的不熟悉字符

  •  3
  • cori  · 技术社区  · 16 年前

    我有一个SQL查询(SQL Server 2005),它是基于一个示例用户定义函数组合而成的:

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

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

    7 回复  |  直到 16 年前
        1
  •  16
  •   Joel Coehoorn    16 年前

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

        2
  •  6
  •   Gordon Bell    16 年前

    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
  •  3
  •   Neall    16 年前

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

        4
  •  1
  •   Chris Cudmore    16 年前

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

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

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

    不过,我还是选择一个更好的变量名。即使是“临时工”也更好。

        5
  •  1
  •   Jimoc    16 年前

    i为您的子查询命名,这样,如果您有一个包含多个子查询的复杂查询,并且您需要访问字段,那么您可以毫不含糊地这样做。

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

        6
  •  0
  •   onedaywhen    16 年前

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

    这样,读者就更有可能理解它,甚至可能在“DT1”中找到“派生表”。

        7
  •  0
  •   Chris    16 年前

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

    SQL Server联机丛书语法表明,在这种情况下,表_别名不是可选的;“table_alias”不包含在括号中,根据Transact-SQL语法约定,括号中的内容是可选的。关键字“AS”是可选的,因为它被括在括号中。。。


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


    http://msdn.microsoft.com/en-us/library/ms177563(SQL.90).aspx