Ben-Gan的一些例子为什么需要“AS”

时间:2013-06-12 13:21:27

标签: sql-server tsql

SELECT MIN(col1) AS start_range, MAX(col1) AS end_range 
FROM (SELECT col1, 
        (
        SELECT MIN(B.col1) 
         FROM dbo.T1 AS B 
         WHERE B.col1 >= A.col1 
           AND NOT EXISTS 
             (SELECT * 
              FROM dbo.T1 AS C 
              WHERE C.col1 = B.col1 + 1)
        ) AS grp
      FROM dbo.T1 AS A) AS jh 
GROUP BY grp;

如果删除“AS jh”,为什么会出错?为什么我需要相同的“AS grp”。 (不一样,因为我分组)但我不能删除它。在第二个代码中没有这样的“AS”。

SELECT col1, 
  (SELECT MIN(B.col1) 
    FROM dbo.T1 AS B 
    WHERE B.col1 >= A.col1 
      -- is this row the last in its group? 
      AND NOT EXISTS 
        (SELECT * 
         FROM dbo.T1 AS C 
         WHERE C.col1 = B.col1 + 1))  FROM dbo.T1 AS A;

第三个代码:

SELECT MIN(col1) AS start_range, MAX(col1) AS end_range 
FROM (SELECT col1,  
        -- the difference is constant and unique per island 
        col1 - ROW_NUMBER() OVER(ORDER BY col1) AS grp 
      FROM dbo.T1) AS D 
GROUP BY grp;

它是如何工作的?它显示与第一个代码相同的结果。 我理解第二和第四个代码。但我真的不明白第三。而我对第一的理解是一半。 那个(第三个)如何运作? 第四:

SELECT col1, col1 - ROW_NUMBER() OVER(ORDER BY col1) AS diff 
FROM dbo.T1; 

1 个答案:

答案 0 :(得分:6)

第一个代码:内联选择返回结果集=需要别名

第二个代码

  • EXISTS是进行半连接的相关子查询。没有结果集
  • 它返回一个标量值(不是结果集) - 不需要别名(但是没有列名)

第三个代码:

  • 使用在SQL Server 2005之前不存在的ROW_NUMBER()
  • 需要别名,因为它返回结果集

在那之后不确定你的意思......