我遇到了一个问题,实际上我正在使用这样的查询:
@
此查询用于一次向用户显示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()
,但这似乎不起作用,有什么主意吗?
答案 0 :(得分:2)
您应该使用row_number() over(order by ...)
。
否则行枚举是不可预测的。
答案 1 :(得分:0)
在这种情况下,您可能要考虑是否使用RRN(T1)
而不是ROW_NUMBER()
。
但是,正如Mark B所说的那样,应始终将ROW_NUMBER()
与ORDER BY子句配合使用,以防止对返回的行进行不可预测的排序。如果没有合适的列作为排序依据,则可以ORDER BY RRN(T1)
。