Запрос иерархии (соединить по предложению)

Я пытаюсь написать запрос, используя предложение 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);  

И теперь я хочу найти учетные записи, столбец платежей которых не заполнен (даже родительский счет). У каждого аккаунта может быть родительский счет (родительский столбец), который указывает на идентификатор другого аккаунта. Может быть, будет проще, если я представлю это на примере:

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

Первый аккаунт в порядке - колонка оплаты заполнена. Второй не в порядке, потому что это ноль - но, как мы видим, есть родительский счет, поэтому мы проверяем (3457 счет), и снова столбец оплаты равен нулю, но снова есть родительский счет (5686) и, наконец, есть столбец оплаты заполнены. Таким образом, для вышеупомянутых ситуаций ничего не должно отображаться. Что если таблица будет выглядеть так:

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

Как мы видим, единственное изменение равно нулю рядом с 5686 идентификатор учетной записи, поэтому правильный выбор должен представлять учетные записи: 4576, 3457, 5686

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

Результаты:

| 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 |
Другие вопросы по тегам