Paradox SetRange 在查询 3 个字段时不提供正确的结果

Posted

技术标签:

【中文标题】Paradox SetRange 在查询 3 个字段时不提供正确的结果【英文标题】:Paradox SetRange does not provide correct result when querying 3 fields 【发布时间】:2011-05-27 05:40:45 【问题描述】:

我在使用 Delphi2010 在 Paradox 7 表中设置二级索引范围时遇到问题。

相关字段为:

特征类型 (int); YMax(整数); XMax(整数); YMin (int); Xmin(整数)。 二级索引按此顺序包含所有这些字段。

我使用这样的 SetRange 语句进行了测试(不需要添加所有字段值,其余部分假定为 NULL 并包含所有值):

table1.IndexName := 'YMaxIndex';
table1.SetRange([101, 280110400],[101, 285103294]); //386236 records

并尝试通过添加约束来获得 0 结果:

table1.IndexName := 'YMaxIndex';
table1.SetRange([101, 280110400, 1],[101, 285103294, 1]); //386236 records

但是还是得到3863236,这在检查表中XMax字段的值时显然是不正确的。

有人可以向我解释一下我对 Paradox index 和 SetRange 的不理解吗?我经常使用类似的代码,但不一定用 3 个字段指定范围。

更新

请参阅下面 Uwe 的回复。最终代码解决方案如下(XMax 的新范围):

Table1.SetRange([101,280110400], [101,285103294]);
Table1.Filter := 'XMax > 100000 and XMax < 110000';
Table1.Filtered := true; 

【问题讨论】:

【参考方案1】:

索引范围始终作为一个整体用于所有字段,而不是单独查找每个字段。结果集将包含这些范围之间的每条记录。以给定顺序对每个索引字段进行比较。

在您的情况下,它将检查记录的 FeatureType 是否在 101..101 之间。如果该字段包含 101,则将其考虑在内。由于字段值位于范围的边界,因此检查下一个字段。

如果 YMax 字段位于 280110400..285103294 之间并且值与边界不匹配(280110400 或 285103294),则将其纳入结果集中,无需进一步检查。在这种情况下,不会检查剩余的索引字段。

您试图获得的结果只能通过过滤条件或适当的 SQL Select 子句实现。

【讨论】:

谢谢,我忘记了这个小细节!我已经用过滤器测试了你的建议,这解决了我的问题......现在进行基准测试。【参考方案2】:

对于范围设置 table1.SetRange([101, 280110400, 1],[101, 285103294, 1]); 以下值在范围内

101 280110400 1 101 280110400 2 101 280110400 3 .... 101 280110401 -maxint .... 101 280110401 maxint .... 101 285103294 0 101 285103294 1

【讨论】:

你是说第三个值(XMax 的那个)被忽略了吗?请进一步解释。您发布的结果将相当于 table1.SetRange([101, 280110400],[101, 285103294]); 在阅读了其他帖子之后,我现在了解了您的列表。感谢您发布示例。【参考方案3】:

对前面的回答稍微澄清一下:

SetRange 分别检查范围开始和结束条件,例如我们有

SetRange([1,2], [2,2])

并记录 (1, 3);

范围开始:第一个字段(边界)有 1 = 1,因此我们检查第二个字段 (2

范围结束:第一个字段(不是边界)有 1

记录在范围内。

【讨论】:

以上是关于Paradox SetRange 在查询 3 个字段时不提供正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

操作必须是可更新的查询 - VB Script, Paradox Table

Paradox DB:查询中的西里尔字母,C#

Paradox 4.5 可以安装在服务器上吗?

将 Delphi BDE Paradox *.db 查询结果导出到文本文件?

查询第名字的第二个字和第三个字相同的sql语句?

Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)