我正在尝试使用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帐户),并且支付列再次为空但是又有一个父帐户(5686)并且最后有一个付款列填充。 所以对于上面的情况,选择不应该是什么 如果表看起来会怎么样:
ACCOUNTID | PARENT | PAYMENT
------------------------------
5436 | 5436 | 1
4576 | 3457 | NULL
5763 | 5643 | 1
5686 | 5686 | NULL
3457 | 5686 | NULL
我们可以看到5686
帐户ID旁边只有一个更改为空,因此正确选择应显示帐户:4576, 3457, 5686
答案 0 :(得分: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
<强> 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 |