查找进程中的第一个和第一个差异4GL



我不清楚下面的查询,很想知道它们之间有什么不同,即使两者都检索到相同的结果。(数据库使用了sports2000)。

对于State="NH"的每个客户,
客户的第一个订单:
DISPLAY Customer.Cust-Num NAME订单编号订单日期
结束。

对于State="NH"的每个客户:
查找第一个订单的客户无错误
如果有订单,则
DISPLAY Customer.Cust-Num NAME订单编号订单日期。结束。

请向我解释

问候Suga

正如AquaAlex所说,你的第一个片段是一个连接(语法的","部分使它成为一个连接),并且有他提到的所有优点和缺点。然而,还有一个重要的附加"con"——与FIRST和FOR进行连接。。。不应使用FIRST。

FOR LAST-查询,给出错误的结果

它最终会咬你的屁股。

FIND FIRST也好不到哪里去。

这两个语句的根本问题是,它们暗示有一个顺序,您想要的记录是它的第一个实例。但声明中没有任何部分规定该顺序。因此,如果有多个记录满足查询,则您不知道实际会得到哪个记录。如果您这样做的唯一原因是探测是否有一个或多个记录,并且您不打算实际使用记录缓冲区,那么这可能没问题。但如果是这样的话,那么CAN-FIND()将是一个更好的语句。

有一个神话认为,FIND FIRST应该更快。如果你相信这一点,或者认识这样的人,我敦促你测试一下。这不是真的。的确,在FIND返回大量记录的情况下,添加FIRST会更快,但这并不是一个苹果对一个苹果。这是在随机抓了一个苹果后扔掉蒲式耳。如果你这样编码,你的苹果现在有了神奇的特性,这将导致无法治愈错误。

OF也是个问题。OF暗示了一个WHERE子句,该子句基于编译器猜测两个表中具有相同名称且属于唯一索引的字段可以用于联接表。这似乎是合理的,也许确实如此,但它掩盖了代码,并使维护程序员的工作更加困难。它是一个很好的演示,但不应该在现实生活中使用。

您的第一个语句是联接语句,这意味着网络流量减少。您只会收到同时存在客户和订单记录的记录,因此无需进行任何进一步检查。(更有效率)

第二个语句将检索每个客户,然后对找到的每个客户进行订单查找。因为可能没有订单,您还需要做一个额外的声明(如果可用)。这是一种效率较低的检索记录的方法,并将导致更多不需要的网络流量和更多正在执行的语句。

相关内容

  • 没有找到相关文章

最新更新