0

progress 网站上订阅的简单问题:progress 4GL 语言是否支持像 Oracle(Connect by 子句)或 Sql Server(CTE)这样的分层查询?

我有下表:

命名父母
----------------------
伊丽莎白二世 null
查尔斯伊丽莎白二世
安德鲁伊丽莎白二世
爱德华伊丽莎白二世
哈里·查尔斯
威廉·查尔斯
詹姆斯·爱德华
乔治·威廉

是否有正在进行的脚本会生成以下输出?

伊丽莎白二世
     |_查尔斯
          |_威廉
               |_乔治
          |_哈利
     |_安德鲁
     |_爱德华
          |_詹姆斯
4

1 回答 1

2

由于 Progress 4GL(实际上是几年前的 ABL)是一个完整的图灵完整语言,你可以。但是也许不是在一个查询中......

这个递归示例可以做到这一点,您可以通过多种不同的方式做到这一点。您可以从此代码开始,但您可能需要进行更多错误检查等。

DEFINE TEMP-TABLE ttPerson NO-UNDO
    FIELD PersonName   AS CHARACTER FORMAT "x(20)"
    FIELD PersonParent AS CHARACTER.

/* A procedure for loading example data */
PROCEDURE createPerson:
    DEFINE INPUT  PARAMETER pcName AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER pcParent AS CHARACTER   NO-UNDO.

    CREATE ttPerson.
    ASSIGN 
        ttPerson.personName   = pcName
        ttPerson.personParent = pcParent.

END.

/* Load some data */
RUN createPerson("Elizabeth II", "").
RUN createPerson("Charles", "Elizabeth II").
RUN createPerson("Andrew", "Elizabeth II").
RUN createPerson("Edward", "Elizabeth II").
RUN createPerson("Harry", "Charles").
RUN createPerson("William", "Charles").
RUN createPerson("James", "Edward").
RUN createPerson("George", "William").

/* Define a frame where the result will be displayed */
DEFINE FRAME f1 ttPerson.personName WITH 20 DOWN.

/* The recursive prodecure */
/* pcPerson - the person where to start track heritage (or perhaps it should have been lineage?*/
/* piDepth, just to format the output */
PROCEDURE trackHeritage:
    DEFINE INPUT  PARAMETER pcPerson AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER piDepth  AS INTEGER     NO-UNDO.

    piDepth = piDepth + 1.
    /* Find the tracked person */
    FIND FIRST ttPerson NO-LOCK WHERE ttPerson.personName = pcPerson NO-ERROR.
    IF AVAILABLE ttperson THEN DO:

        DISPLAY FILL(" ", piDepth) + "|_" + ttPerson.personName @ ttPerson.personName WITH FRAME f1.

        DOWN 1 WITH FRAME f1.

        /* Track all available children to the person */
        FOR EACH ttPerson NO-LOCK WHERE ttPerson.personParent = pcPerson:
            RUN trackHeritage(ttPerson.personName, piDepth).
        END.
    END.
END.
/* Start tracking */
RUN trackHeritage("Elizabeth II", 0).

MESSAGE "Done" VIEW-AS ALERT-BOX.
于 2014-06-26T11:59:45.203 回答