Запрос иерархии (соединить по предложению)
Я пытаюсь написать запрос, используя предложение 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 ответ
Настройка схемы 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 |