1
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; 
4

1 回答 1

6

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

第二个代码

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

第三个代码:

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

不知道你之后的意思...

于 2013-06-12T13:29:21.860 回答