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 ステートメントでは指定されません。使用されているインデックスに従って LAST レコードを取得し、並べ替えは行われません。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 に答える