在子查询中使用 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)
.
我遇到了一个问题,实际上我正在使用这样的查询:
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)
.