Mat*_*don 3 progress-4gl openedge
我想使用以下查询来查找最后一个招标ID.
FOR EACH tender-table NO-LOCK WHERE tender-table.kco = 1 BY tender-table.id:
DISPLAY tender-table.id.
END.
Run Code Online (Sandbox Code Playgroud)
此查询查看所有投标ID,并以升序返回所有id的所有结果.我得到的结果是
1,035 1.036 ...... 1,060 1,061 1,062 1,063 1,064 1,065 1,066
FOR LAST tender-table NO-LOCK WHERE tender-table.kco = 1 BY tender-table.id:
DISPLAY tender-table.id.
END.
Run Code Online (Sandbox Code Playgroud)
但是,当我使用此查询来查找最后一个ID时,我得到结果,
1061
当我应该看到结果1,066.任何人都可以建议为什么会这样吗?
最后是一个非常具有欺骗性的陈述.(首先是这样.)它没有以直观的方式表现.排序顺序不是由BY语句指定的.您将根据使用的索引获取LAST记录,不会进行排序.当BY引用未索引的字段(或者没有按照实际使用的索引的顺序排序的字段)或WHERE子句显然没有按照您希望的顺序映射到索引时,将选择神秘的记录.
就个人而言,我强烈建议你忘记使用FOR FIRST&FOR LAST.一个更好的选择,总是按预期排序,将是:
FOR EACH tableName WHERE someCriteria BREAK BY sortOrder:
LEAVE.
END.
DISPLAY whatEver.
Run Code Online (Sandbox Code Playgroud)
(添加"DESCENDING"以从FIRST翻到最后......)
以防任何人需要说服力 - 尝试使用"体育"数据库:
for first customer no-lock by discount:
display name discount.
end.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4004 次 |
| 最近记录: |