3

我正在寻找使用以下查询来查找最后一个投标 ID。

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

此查询查看所有投标 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.

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

1,061

当我应该看到结果 1,066 时。谁能建议为什么会这样?

4

2 回答 2

6

FOR LAST 是一个非常具有欺骗性的陈述。(FOR FIRST 也是如此。)它的行为并不直观。BY 语句未指定排序顺序。您将根据使用的索引获得最后一条记录,并且不会进行排序。当 BY 引用未索引的字段(或未按实际使用的索引顺序排序的字段)或 WHERE 子句明显未按照您希望的顺序映射到索引时,您将选择神秘记录.

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

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

(添加“DESCENDING”以从 FIRST 翻转到 LAST...)

以防万一有人需要说服——用“体育”数据库试试这个:

for first customer no-lock by discount:
  display name discount.
end.
于 2013-01-09T12:56:24.603 回答
1

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

于 2013-01-09T12:13:59.123 回答