如何获取有关 Progress 4GL 的 SQL 查询?
How to get SQL query on Progress 4GL?
我想显示所有商品以及购买和未购买此类商品的客户名单。显示项目、项目名称、购买的客户名称、未购买的客户名称的列。在 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 -- 进度不是 SQL。你越努力SQL你就会越不快乐。
4GL 引擎对 "embedded" 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 代码不倾向于使用大量复杂的查询。它们通常是按程序建立的,可能涉及 temp-tables.
索引非常重要。与许多 SQL 引擎不同,4gl 使用静态的、基于规则的编译时优化器。它对数据分布一无所知,根据规则选择索引。这可能有帮助:
http://pugchallenge.org/downloads2014/374_Still_Dont_Know_About_Indices_PCA2014.pdf
如果您想 select 不在子查询中的记录,CAN-FIND() 函数可能会有所帮助,尽管它不会对性能有很大帮助。它通常会导致 table 扫描。
即
for each customer no-lock where not can-find( first order where order.custNum = customer.custNum ):
/* customers with no orders... */
end.
我想显示所有商品以及购买和未购买此类商品的客户名单。显示项目、项目名称、购买的客户名称、未购买的客户名称的列。在 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 -- 进度不是 SQL。你越努力SQL你就会越不快乐。
4GL 引擎对 "embedded" 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 代码不倾向于使用大量复杂的查询。它们通常是按程序建立的,可能涉及 temp-tables.
索引非常重要。与许多 SQL 引擎不同,4gl 使用静态的、基于规则的编译时优化器。它对数据分布一无所知,根据规则选择索引。这可能有帮助:
http://pugchallenge.org/downloads2014/374_Still_Dont_Know_About_Indices_PCA2014.pdf
如果您想 select 不在子查询中的记录,CAN-FIND() 函数可能会有所帮助,尽管它不会对性能有很大帮助。它通常会导致 table 扫描。
即
for each customer no-lock where not can-find( first order where order.custNum = customer.custNum ):
/* customers with no orders... */
end.