2014-06-26 56 views
0

進度站點上訂閱的簡單問題: 4GL語言是否支持分層查詢,如Oracle(Connect by clause)或Sql Server(CTE)?4GL語言是否支持分層查詢?

我有以下表格:

 
Name    parent 
----------------------- 
Elizabeth II  null 
Charles   Elizabeth II 
Andrew   Elizabeth II 
Edward   Elizabeth II 
Harry    Charles 
William   Chales 
James    Edward 
George   William 

是否有會生成以下輸出進度腳本?

 
Elizabeth II 
    |_Charles 
      |_William 
       |_George 
      |_Harry 
    |_Andrew 
    |_Edward 
      |_James 
+2

請補充說明您已經嘗試 – atk

回答

2

由於Progress 4GL(實際上是幾年以來的ABL)是一個完整的turing完整語言,你可以。然而,也許不是在一個單一的查詢...

這個遞歸的例子,它可以做許多不同的方式。您可以使用此代碼開始,但您可能需要有更多的錯誤檢查等

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. 
+0

的步驟我知道進展遞歸性。但是,由於Progress有一個標準的SQL語法,我想知道該語言是否支持CONNECT BY子句。 我認爲有一個簡單而快速的方法來完成這項任務。 –

+0

SQL進程的本機支持與SQL-92最兼容。我不確定CONNECT BY是否是真正的標準SQL,而是Oracle和其他dbs的一個特性。如果你正在運行的本地進程,我建議你堅持ABL/4GL。通過ODBC可能有其他可能性。 – Jensd