使用SQL CTE获取不一致的行索引以进行表比较

时间:2014-03-11 17:26:36

标签: sql sql-server stored-procedures

有时下面的查询有效,有时则不会返回任何结果。它没有返回结果的时间是由于匹配的行号(rowA = rowB)。其他时候它会返回结果,因为行索引彼此相距1。有什么想法在这里发生了什么?以下是查询的简化版本。

DECLARE @startRowIndex INT = 0
@param1 nvarchar(100),
@param2 nvarchar(100)

SET @startRowIndex = ( @page_index * @page_size ) + 1;

WITH cte
     AS (SELECT A.colA,
                A.colB,
                B.colC,
                ROW_NUMBER()OVER(ORDER BY colA, colB) AS rn
         FROM   tableA A WITH (NOLOCK)
                LEFT OUTER JOIN tableB B WITH (NOLOCK)
                  ON A.colA = B.colA
                WHERE A.colD IN (@param1, @param2))
SELECT TOP (@page_size)c1.rn AS rowA,
                       c2.rn AS rowB,
                       c1.colA,
                       c1.colB,
                       c1.colC,
                       c2.colA,
                       c2.colB,
                       c2.colC
FROM   cte c1
       INNER JOIN cte c2
         ON c1.colA = c2.colA
            AND c2.rn = c1.rn + 1
            AND c1.rn >= @startRowIndex
            AND ( c1.colB <> c2.colB
                   OR c1.colC <> c2.colC )
ORDER  BY c1.colA,
          c1.colB 

1 个答案:

答案 0 :(得分:1)

只关注外部查询:

SELECT top (@page_size)c1.rn as rowA, c2.rn as rowB, c1.colA, c1.colB, c1.colC, c2.colA, c2.colB, c2.colC
FROM cte c1 INNER JOIN
     cte c2
     ON c1.colA = c2.colA AND c2.rn = c1.rn + 1 AND
------------------------------^
        c1.rn >= @startRowIndex AND
        (c1.colB <> c2.colB OR c1.colC <> c2.colC)
order by c1.colA, c1.colB

对于CTE中的每个colA值,最后一行的注意条件将失败。因此,如果您只有单例值(可能是由于其他条件),您将无法获得任何结果。