【问题标题】:hierarchy query (connect by clause)层次查询(按子句连接)
【发布时间】:2016-02-15 14:28:45
【问题描述】:

我正在尝试使用 connect by 子句编写查询,但我无法处理。

一般我有桌子:

CREATE TABLE "TESTOWA" (
    "ACCOUNT" VARCHAR2(20 BYTE), 
    "PARENT"  VARCHAR2(20 BYTE), 
    "PAYMENT" VARCHAR2(20 BYTE)
);

Insert into TESTOWA (ACCOUNT,PARENT,PAYMENT) values ('5436','5436','1');
Insert into TESTOWA (ACCOUNT,PARENT,PAYMENT) values ('4576','3457',null);
Insert into TESTOWA (ACCOUNT,PARENT,PAYMENT) values ('5763','5686','1');
Insert into TESTOWA (ACCOUNT,PARENT,PAYMENT) values ('5686','5686',null);
Insert into TESTOWA (ACCOUNT,PARENT,PAYMENT) values ('3457','5686',null);  

现在,我要做的是找到一个未填写付款栏的帐户(甚至是父帐户) 每个帐户都可以有指示其他帐户 ID 的父帐户(父列)。 如果我在示例中展示它可能会更容易:

 ACCOUNTID | PARENT | PAYMENT
-----------------------------
    5436   |  5436  |    1
    4576   |  3457  |  NULL
    5763   |  5643  |    1
    5686   |  5686  |    1
    3457   |  5686  |  NULL

第一个帐户没问题 - 付款栏已填满。 第二个不行,因为它是空的-但是我们可以看到有一个父帐户,所以现在我们检查 (3457 account) ,付款栏再次为空,但再次有一个父帐户 (5686),最后有一个付款栏填充。 所以对于上面的情况,选择不应该什么都没有 如果 Table 看起来会怎样:

 ACCOUNTID | PARENT | PAYMENT
------------------------------
    5436   |  5436  |    1
    4576   |  3457  |  NULL
    5763   |  5643  |    1
    5686   |  5686  |  NULL
    3457   |  5686  |  NULL

我们可以看到,5686 帐户 ID 旁边唯一的变化是 null,因此正确的选择应该显示帐户:4576, 3457, 5686

【问题讨论】:

    标签: sql oracle hierarchical-data connect-by


    【解决方案1】:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TABLE "TESTOWA" (   
      ACCOUNT NUMBER(4,0), 
      PARENT  NUMBER(4,0), 
      PAYMENT NUMBER(1,0)
    );
    Insert into TESTOWA values (5436,5436,1);
    Insert into TESTOWA values (5686,5686,null);
    Insert into TESTOWA values (5763,5686,1);
    Insert into TESTOWA values (3457,5686,1); 
    Insert into TESTOWA values (4576,3457,null);
    

    查询 1

    SELECT t.*,
           CONNECT_BY_ROOT( PAYMENT ) AS HAS_PAYED
    FROM   TESTOWA t
    START WITH
           ACCOUNT = PARENT
    OR     PAYMENT = 1
    CONNECT BY
           NOCYCLE
           PRIOR ACCOUNT = PARENT
    AND    PAYMENT IS NULL
    

    Results

    | ACCOUNT | PARENT | PAYMENT | HAS_PAYED |
    |---------|--------|---------|-----------|
    |    5436 |   5436 |       1 |         1 |
    |    3457 |   5686 |       1 |         1 |
    |    4576 |   3457 |  (null) |         1 |
    |    5686 |   5686 |  (null) |    (null) |
    |    5763 |   5686 |       1 |         1 |
    

    【讨论】:

    • 天哪!我永远猜不到该怎么做
    • START WITH ... PAYMENT = 1 确保所有付费帐户都在层次结构的根目录下,CONNECT BY ... PAYMENT IS NULL 确保付费帐户不包含在其他层次结构中(因此您不必担心重复计算) . START WITHCONNECT BY 的其他位仅将其他(未付费)帐户包含在选择中。由于每个付费帐户始终位于层次结构的根部,因此CONNECT_BY_ROOT( PAYMENT ) 会告诉您您是否已付款。
    • 好的,现在我明白了:)再次感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多