有时下面的查询有效,有时则不会返回任何结果。它没有返回结果的时间是由于匹配的行号(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
答案 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
值,最后一行的注意条件将失败。因此,如果您只有单例值(可能是由于其他条件),您将无法获得任何结果。