我不清楚下面的查询,并且很想知道它们之间有什么不同,即使它们都检索到相同的结果。 (数据库使用sports2000)。
对于每个客户WHERE状态=“NH”,
第一客户订单:
显示Customer.Cust-Num名称订单 - 订单日期。
结束。
对于每个客户WHERE状态=“NH”:
找到客户的第一个订单NO-ERROR
如果可用订单那么
显示Customer.Cust-Num NAME Order-Num Order-Date。
结束。
请解释我
此致 须贺
答案 0 :(得分:3)
正如AquaAlex所说,你的第一个片段是一个连接(“,”,语法的一部分使它成为一个连接)并具有他提到的所有优点和缺点。然而,还有一个重要的额外“骗局” - 正在与FIRST和FOR进行联接......永远不应该使用FIRST。
FOR LAST - Query, giving wrong result
它最终会咬你的屁股。
找到第一个并不是更好。
这两个陈述的根本问题在于它们暗示有一个订单,您所需的记录是第一个实例。但是该声明的任何部分都没有规定该命令。因此,如果有多个记录满足查询,则您不知道您将实际获得哪条记录。如果您这样做的唯一原因是探测是否有一个或多个记录并且您无意实际使用记录缓冲区,那可能没问题。但如果是这种情况,那么CAN-FIND()将是一个更好的使用声明。
有一个神话,说FIND FIRST应该更快。如果您相信这一点,或者知道有人这样做,我建议您进行测试。这不是真的。确实,在FIND返回大量记录的情况下,添加FIRST的速度更快 - 但这不是苹果。那是在随机抓苹果之后丢掉蒲式耳。如果你这样编码你的苹果现在有神奇的属性,这将导致无法治愈虫子。
OF也存在问题。 OF表示基于编译器猜测的WHERE子句,两个表中具有相同名称的字段和唯一索引的一部分可用于连接表。这似乎是合理的,也许是合理的,但它掩盖了代码并使维护程序员的工作变得更加困难。它是一个很好的演示,但不应该在现实生活中使用。
答案 1 :(得分:0)
您的第一个语句是连接语句,这意味着更少的网络流量。并且您只会收到客户和订单记录都存在的记录,因此不需要进行任何进一步的检查。 (更有效率)
第二个语句将检索每个客户,然后为每个客户发现它将按订单查找。因为可能没有订单,您还需要做一个额外的声明(如果可用)。这是一种检索记录的效率较低的方法,会导致更多不必要的网络流量和更多正在执行的语句。