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

时间:2019-05-21 15:00:53

标签: sql db2 db2-400

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

@

此查询用于一次向用户显示10个结果,SELECT * FROM( SELECT row_number() over() as VAL_RRN, T1.FIELD1 AS FIELD1, T1.FIELD2 AS FIELD2 FROM MYTABLE1 AS T1 ) as subquerry WHERE VAL_RRN >= X FETCH FIRST 10 ROWS ONLY 变量与滚动系统一起使用,以使用户可以浏览结果。 此查询效果很好(但我不知道这是否是最好的方法)。

无论如何,我实际上需要做的是一些不同:

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 subquerry 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的实际值是完全随机的,我也不知道为什么。我尝试使用row_number() over()代替VALUE(),但这似乎不起作用,有什么主意吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

但是,正如Mark B所说的那样,应始终将ROW_NUMBER()与ORDER BY子句配合使用,以防止对返回的行进行不可预测的排序。如果没有合适的列作为排序依据,则可以ORDER BY RRN(T1)