- 论坛徽章:
- 0
|
回复 #1 法郎士 的帖子
这个问题有点像用8位机的汇编语言写一个比较字符串大小的程序。
8位机每次只可以比较一个字节(相当于这里我们一次只可以比较一个键值)。setll的条件类似于文件的键值和 setll 的键值:
my_pos_key klist
kfld p1
kfld p2
kfld p3
...
kfld pn
my_pos_key setll my_file
K1K2K3K4K5...KN >= P1P2P3P4P5...PN
我们从左到右进行比较:
如果K1>p1, 肯定满足条件。
如果K1=p1, 再比较下一个键。
如果K1<p1, 立马出局,比都不用比。
.....
如果K2>p2, 肯定满足条件。
如果K2=p2, 再比较下一个键。
如果K2<p2, 立马出局,比都不用比。
...
如果Kn>=pn, 肯定满足条件。
如果Kn<pn, 立马出局,比都不用比。
用SQL CURSOR陈述就像下面一样子:
DECLARE C1 CURSOR FOR SELECT * FROM MY_FILE
WHERE
K1>:p1
OR
K1=:p1 AND K2>:p2
OR
K1=:p1 AND K2=:p2 AND K3>:p3
OR
...
OR
K1=:p1 AND K2=:p2 AND K3=:p3 AND ... AND Kn-2>:pn-2
OR
K1=:p1 AND K2=:p2 AND K3=:p3 AND ... AND Kn-2=:pn-2 AND Kn-1>:pn-1
OR
K1=:p1 AND K2=:p2 AND K3=:p3 AND ... AND Kn-2=:pn-2 AND Kn-1=:pn-1 AND Kn>=pn
ORDER BY
K1, K2, K3, ... Kn
好像太复杂。有没有更好的方法呢?先抛砖引玉一下。请网友们多提建议。
这种方法只可以前进,不能倒退(如用于subfile 的 page-up).
[ 本帖最后由 franliu 于 2009-12-8 10:04 编辑 ] |
|