如何在 PROGRESS 4GL - OpenEdge 10.2A 的 OPEN QUERY 语句中实现 NOT EXISTS

How to implement NOT EXISTS in OPEN QUERY statement in PROGRESS 4GL - OpenEdge 10.2A

我想创建一个浏览器,如果某个字段的值不存在于另一个 table。

,它将显示一个 table 的所有记录

可以使用 SQL 获取记录:

SELECT myField FROM pub.myTable WHERE 
NOT EXISTS (SELECT myField FROM pub.myTable2 WHERE myTable2.myField=myTable.myField)

也可以使用 4GL 作为:

FOR EACH myTable WHERE 
NOT CAN-FIND(FIRST myTable2 WHERE myTable2.myField=myTable.myField)

问题是当我将此查询放入浏览器中时:

OPEN QUERY myBrowse
FOR EACH myTable WHERE 
NOT CAN-FIND(FIRST myTable2 WHERE myTable2.myField=myTable.myField)

它给出错误信息

CAN-FIND is invalid within an OPEN QUERY. (3541)

问题是,这样的OPEN QUERY语句可以写吗?

这不是我想出来的,Steve Moore 在 https://community-archive.progress.com/forums/00026/27143.html

上分享了它
define temp-table ttNoOrder
       field field1 as char.

create ttNoOrder.

define query q1 for Customer, Order, ttNoOrder.

open query q1 for each Customer no-lock,
     first Order of Customer outer-join no-lock,
     first ttNoOrder where not available(Order).

get first q1.

repeat while not query-off-end("q1"):
   display Customer.CustNum Customer.Name available(Order).
   get next q1.
end.

甚至适用于动态查询:

DEFINE TEMP-TABLE ttNoOrder
       FIELD field1 AS CHARACTER .

DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.

CREATE ttNoOrder.

CREATE QUERY hQuery .

hQuery:SET-BUFFERS (BUFFER Customer:HANDLE,
                    BUFFER Order:HANDLE,
                    BUFFER ttNoOrder:HANDLE) .

hQuery:QUERY-PREPARE ("for each Customer no-lock, ~
     first Order of Customer outer-join no-lock, ~
     first ttNoOrder where not available(Order)") .

hQuery:QUERY-OPEN() .
hQuery:GET-FIRST () .

REPEAT WHILE NOT hQuery:QUERY-OFF-END:
   DISPLAY Customer.CustNum FORMAT ">>>>>>>>>9" Customer.Name AVAILABLE(Order).
   hQuery:GET-NEXT ().
END.