如何在Progress 4GL上获取SQL查询?

时间:2015-03-06 18:20:25

标签: sql progress-4gl openedge progress-db

我想显示已购买但未购买此类商品的所有商品和客户名单。列显示项目,项目名称,客户购买的名称,客户名称未购买。在SQL中它看起来像这样。

 SELECT field1,field2,field3 
    FROM tbl1 JOIN tbl2 on ... 
    WHERE field3 NOT IN (
          SELECT distinct field3 FROM tbl3 JOIN tbl4 on ...
          WHERE ...)

这里有4个表

customers      orders             orderlines        items
custid|name|   orderid|custid|    orderid|itemid|  itemid|name 

1 个答案:

答案 0 :(得分:3)

规则#1 - 进度不是SQL。你越努力使SQL变得更加困难。

对#34;嵌入式"的支持非常有限。 4GL引擎中的SQL-89。如果你试图使用它,因为你更喜欢SQL,你会很快变得非常沮丧。它偶尔会对一个非常快速的&脏的即席查询,但没有用处。

SQL和4GL之间没有直接的转换。

4gl中的查询非常具有程序性。你的问题有点不清楚,但你可能会尝试类似的东西:

for each customer no-lock:
  for each order no-lock where order.custNum = customer.custNum:
    for each orderLine no-lock where orderLine.orderNum = order.orderNum:
      display customer.custName order.orderStat orderLine.description.
    end.
  end.
end.

这个例子很粗糙 - 4gl支持更多功能,包括动态查询和OO结构,但目前还不清楚你真正需要什么。

您可以使用连接编写上面的代码,但初学者不太清楚:

for each customer no-lock,
    each order no-lock where order.custNum = customer.custNum,
    each orderLine no-lock where orderLine.orderNum = order.orderNum:

  display customer.custName order.orderStat orderLine.description.

end.

4gl代码不会使用大量复杂的查询。它们通常是在程序上构建的,可能涉及临时表。

索引非常重要。与许多SQL引擎不同,4gl使用静态的,基于规则的编译时优化器。它对数据分发一无所知,并根据规则选择索引。这可能会有所帮助:

http://pugchallenge.org/downloads2014/374_Still_Dont_Know_About_Indices_PCA2014.pdf

如果要选择不在子查询中的记录,CAN-FIND()函数可能会有所帮助,尽管它对性能不是很好。它通常会导致表扫描。

for each customer no-lock where not can-find( first order where order.custNum = customer.custNum ):
  /* customers with no orders... */
end.