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

use*_*214 1 t-sql sql-server

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;
Run Code Online (Sandbox Code Playgroud)

如果我删除"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;
Run Code Online (Sandbox Code Playgroud)

第三个代码:

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;
Run Code Online (Sandbox Code Playgroud)

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

SELECT col1, col1 - ROW_NUMBER() OVER(ORDER BY col1) AS diff 
FROM dbo.T1; 
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 6

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

第二个代码

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

第三个代码:

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

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