【问题标题】:Does progress 4GL language support hierarchical queries?progress 4GL 语言是否支持分层查询?
【发布时间】:2014-06-26 11:22:50
【问题描述】:

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

我有下表:

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

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

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

【问题讨论】:

  • 请添加您已经尝试过的步骤

标签: progress-4gl hierarchical-query


【解决方案1】:

自从 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.

【讨论】:

  • 我知道正在进行中的递归。但是,由于 Progress 具有标准的 SQL 语法,我想知道该语言是否支持 CONNECT BY 子句。我认为有一种简单快捷的方法可以完成这项任务。
  • 对 SQL in Progress 的原生支持最多与 SQL-92 兼容。我不确定 CONNECT BY 是否真的是标准 SQL,而是 Oracle 和其他一些数据库的功能。如果您正在运行本机 Progress,我建议您坚持使用 ABL/4GL。通过 ODBC 可能还有其他可能性。
猜你喜欢
  • 1970-01-01
  • 2012-03-19
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多