在子查询中使用 ROW_NUMBER() OVER()

Using ROW_NUMBER() OVER() in subquery

我遇到了一个问题,实际上我正在使用这样的查询:

SELECT * 
FROM
    (SELECT 
         ROW_NUMBER() OVER() as VAL_RRN,
         T1.FIELD1 AS FIELD1,
         T1.FIELD2 AS FIELD2 
     FROM 
         MYTABLE1 AS T1) AS subquery 
WHERE 
    VAL_RRN >= X
FETCH FIRST 10 ROWS ONLY

此查询用于一次向用户显示 10 个结果,X 变量与滚动系统一起使用,让用户浏览结果。

这个查询效果很好(但我不知道这是否是最好的方法)。

无论如何,我实际需要做的有点不同:

SELECT * 
FROM
    (SELECT 
         ROW_NUMBER() OVER() as VAL_RRN,
         T1.FIELD1 AS FIELD1,
         T1.FIELD2 AS FIELD2,
         COALESCE((SELECT '1'
                   FROM MYTABLE1 AS T2 
                   WHERE T1.FIELD1 = T2.FIELD2 FETCH FIRST ROW ONLY), '0') AS FIELD3 FROM MYTABLE1 AS T1) AS subquery 
WHERE 
     VAL_RRN >= X
FETCH FIRST 10 ROWS ONLY

COALESCE 子句用于了解某一行是否有其他行引用它。

MYTABLE1 中,FIELD1 是主键,FIELD2 是外键,定义为:

CONSTRAINT CONSTRAINT_NAME FOREIGN KEY                            
  (FIELD2) REFERENCES MYTABLE (FIELD1) ON DELETE SET NULL

MYTABLE table 可以有引用其他行的行。

但是当我使用第二种查询时,row_number() over()的实际值是完全随机的,我不知道为什么。我尝试使用 VALUE() 而不是 COALESCE() 但这似乎不起作用,有什么想法吗?

你应该使用 row_number() over(order by ...).
否则行枚举是不可预测的。

在这种情况下,您可能要考虑是否使用 RRN(T1) 而不是 ROW_NUMBER()

但是正如 Mark B 所说,您应该始终使用带有 ROW_NUMBER() 的 ORDER BY 子句来防止返回行的不可预测的排序。如果没有合适的列作为排序依据,您可能 ORDER BY RRN(T1).