CREATE TABLE CONNECT_BY_LEVEL_TEST(ID number,NAME VARCHAR2(10),C NUMBER,N1 NUMBER,N2 NUMBER,D NUMBER);
INSERT INTO CONNECT_BY_LEVEL_TEST VALUES(1,'aa',NULL,11,12,NULL);
INSERT INTO CONNECT_BY_LEVEL_TEST VALUES(2,'bb',NULL,11,11,NULL);
INSERT INTO CONNECT_BY_LEVEL_TEST VALUES(3,'cc',NULL,NULL,NULL,11);
COMMIT;
--将CONNECT_BY_LEVEL_TEST数据按N1和N2的区间拆分,
--先规定N1和N2都不为空或者都为空,且N1<=N2
--若N1和N2相同,则将N1的值写入C,
--如N1<N2,则将这条数据拆分成N2-N1+1条数据,并将N1按照,N1、N1+1、N1+2。。。N2的规则放入C。
--如果N1和N2都为空,则不拆分,将D放入C中
SELECT T.ID AS ID,
T.NAME AS NAME,
NVL2(N1,N1+LEVEL-1,D) AS C,
N1,
N2,
D
FROM CONNECT_BY_LEVEL_TEST T
CONNECT BY LEVEL<=NVL((N2-N1),0)+1;
--以上SQL结果出现了大量重复数据,如何更好的实现这种需求
INSERT INTO CONNECT_BY_LEVEL_TEST VALUES(1,'aa',NULL,11,12,NULL);
INSERT INTO CONNECT_BY_LEVEL_TEST VALUES(2,'bb',NULL,11,11,NULL);
INSERT INTO CONNECT_BY_LEVEL_TEST VALUES(3,'cc',NULL,NULL,NULL,11);
COMMIT;
--将CONNECT_BY_LEVEL_TEST数据按N1和N2的区间拆分,
--先规定N1和N2都不为空或者都为空,且N1<=N2
--若N1和N2相同,则将N1的值写入C,
--如N1<N2,则将这条数据拆分成N2-N1+1条数据,并将N1按照,N1、N1+1、N1+2。。。N2的规则放入C。
--如果N1和N2都为空,则不拆分,将D放入C中
SELECT T.ID AS ID,
T.NAME AS NAME,
NVL2(N1,N1+LEVEL-1,D) AS C,
N1,
N2,
D
FROM CONNECT_BY_LEVEL_TEST T
CONNECT BY LEVEL<=NVL((N2-N1),0)+1;
--以上SQL结果出现了大量重复数据,如何更好的实现这种需求