最后 - 查询,给出错误的结果

时间:2013-01-09 12:08:57

标签: progress-4gl openedge

我希望使用以下查询来查找最后一个招标ID。

FOR EACH tender-table NO-LOCK WHERE tender-table.kco = 1 BY tender-table.id:
DISPLAY  tender-table.id.
END. 

此查询查看所有投标ID,并以升序返回所有ID的所有结果。我得到的结果是

1035 1.036 ...... 1060 1061 1062 1063 1064 1065 1066

FOR LAST tender-table NO-LOCK WHERE tender-table.kco = 1 BY tender-table.id:
DISPLAY  tender-table.id.
END.

但是,当我使用此查询查找最后一个ID时,我得到结果

1061

当我看到结果1,066时。任何人都可以建议为什么会这样吗?

2 个答案:

答案 0 :(得分:5)

FOR LAST是一个非常具有欺骗性的陈述。 (首先是这样。)它没有以直观的方式表现。排序顺序不是由BY语句指定的。您将根据使用的索引获取LAST记录,不会进行排序。当BY引用未索引的字段(或者没有按照实际使用的索引的顺序排序的字段)或WHERE子句显然没有按照您希望的顺序映射到索引时,将选择神秘的记录

就个人而言,我强烈建议您忘记使用FOR FIRST&最后。一个更好的选择,总是按预期排序,将是:

FOR EACH tableName WHERE someCriteria BREAK BY sortOrder:
  LEAVE.
END.
DISPLAY whatEver.

(添加“DESCENDING”以从FIRST翻到最后......)

以防任何人需要说服力 - 尝试使用“体育”数据库:

for first customer no-lock by discount:
  display name discount.
end.

答案 1 :(得分:1)

抱歉,我已经设法弄清楚1,066的值没有bid-table.kco = 1.这解决了这个问题。谢谢你的时间。