层次结构查询(连接子句)
hierarchy query (connect by clause)
我正在尝试使用 connect by 子句编写查询,但我无法处理。
一般我有table:
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
第一个帐户没问题 - 付款栏已填满。
第二个不行,因为它是 null - 但我们可以看到有一个父帐户,所以现在我们检查 (3457 account) ,付款列再次为 null 但再次有一个父帐户 (5686) 最后有一个付款列填充。
因此,对于 select 以上的情况,不应出现任何内容
如果 Table 看起来会怎样:
ACCOUNTID | PARENT | PAYMENT
------------------------------
5436 | 5436 | 1
4576 | 3457 | NULL
5763 | 5643 | 1
5686 | 5686 | NULL
3457 | 5686 | NULL
正如我们所见,唯一的变化是 5686
帐户 ID 旁边的空值,因此正确的 select 应该显示帐户:4576, 3457, 5686
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 |
我正在尝试使用 connect by 子句编写查询,但我无法处理。
一般我有table:
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
第一个帐户没问题 - 付款栏已填满。 第二个不行,因为它是 null - 但我们可以看到有一个父帐户,所以现在我们检查 (3457 account) ,付款列再次为 null 但再次有一个父帐户 (5686) 最后有一个付款列填充。 因此,对于 select 以上的情况,不应出现任何内容 如果 Table 看起来会怎样:
ACCOUNTID | PARENT | PAYMENT
------------------------------
5436 | 5436 | 1
4576 | 3457 | NULL
5763 | 5643 | 1
5686 | 5686 | NULL
3457 | 5686 | NULL
正如我们所见,唯一的变化是 5686
帐户 ID 旁边的空值,因此正确的 select 应该显示帐户:4576, 3457, 5686
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 |