【问题标题】:Using a SQL minus operation in PROGRESS 4GL?在 PROGRESS 4GL 中使用 SQL 减号操作?
【发布时间】:2021-07-02 14:39:56
【问题描述】:

有没有一种方法可以使 SQL in Progress 中的减号操作等效?我有 2 个选择,想要第一个减去第二个。 例如,最初在 SQL 中是这样的:

select id from item
minus
select id from item-uni

我正在尝试这样做

DEF TEMP-TABLE tt-item NO-UNDO
FIELD item-id    AS INT
FIELD desc       AS CHAR
.

DEF TEMP-TABLE tt-item2 NO-UNDO
FIELD item-id    AS INT
FIELD desc       AS CHAR
.


FOR EACH item-uni
WHERE item-uni.desc = '101':

        CREATE tt-item.
        ASSIGN
        tt-item.item-id   = item-uni.item-id
        tt-item.desc = item-uni.desc
        .
END.

   FOR EACH item:

        CREATE tt-item2.
        ASSIGN
        tt-item2.item-id   = item.item-id
        tt-item2.desc = item.desc
        .
END.



FOR EACH tt-item,
    EACH tt-item2
    WHERE tt-item.item-id = tt-item2.item-id:

            DELETE tt-item.
    END.

但是,当我尝试执行此操作时,我收到一条错误消息。有没有一种简单的方法(或至少更容易)来做到这一点?谢谢。

【问题讨论】:

  • 一条错误信息...

标签: openedge progress-4gl


【解决方案1】:

如果我正在阅读 minus 应该做什么,即从外部选择返回所有行,而内部选择中不存在任何行,那么应该这样做:

for each item
   where not can-find( 
            item-uni 
               where item-uni.id = item.id
         )
no-lock:

   /* do something */

end.

【讨论】:

  • 这正是我想要的。对不起,如果我不是很清楚,但你已经准确地教会了我我想要什么。我不知道这个可以找到的功能。谢谢。
  • 如果 id 在 item-uni 中不是唯一的,你不需要 can-find(first ...) 。
【解决方案2】:

自从我发布以来已经有几天了,因为直到现在我才设法得到一个好的和正确的答案。我必须在 IF 子句中使用 NOT CAN-FIND 才能使其工作。 第一个临时表获取我想要的值,第二个查看哪些值在我不想要的表上。第三次迭代是 NOT CAN-FIND 所在的位置,使它像我想使用的“减号”。变成了这样:

IF NOT CAN-FIND (tt-item-temp2
            WHERE tt-item-temp2.item-id = tt-item-temp.item-id) THEN DO:

再次感谢 Stefan。如果不是你,我找不到这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多