-----------测试数据--------------
create table test111(父层 varchar2(20),父层代码 varchar2(20),子层 varchar2(20),子层代码 varchar2(20))
insert into test111(父层,父层代码,子层,子层代码)VALUES('L500957','L02041','UE24205','L02021')
insert into test111(父层,父层代码,子层,子层代码)VALUES('L500957','L02041','7155031A','DUMMY')
insert into test111(父层,父层代码,子层,子层代码)VALUES('UE24205','L12021','7155031A','DUMMY')
insert into test111(父层,父层代码,子层,子层代码)VALUES('UE24205','L02021','7155031A','DUMMY')
insert into test111(父层,父层代码,子层,子层代码)VALUES('L500958','L12041','UE24205','L02021')
insert into test111(父层,父层代码,子层,子层代码)VALUES('L500958','L12041','UE24205','L12021')
insert into test111(父层,父层代码,子层,子层代码)VALUES('L500958','L12041','7155031A','DUMMY')
-----------测试数据--------------我的限制条件是:
1、父层代码前两位为‘L1’时,子层代码的前两位可以为‘L0’或‘L1’
2、父层代码前两位为‘L0’时,子层代码的前两位只能为‘L0’
3、子层代码为‘DUMMY’时是最底层的子层,不受1、2两个条件限制SELECT LEVEL AS LV,父层,父层代码,子层,子层代码 FROM WEBSKY.TEST111
start with 父层 like 'L500%'
connect by prior 子层=父层
以上是展开构成的语句,得到的结果为:LV       父层     父层代码 子层     子层代码
---------------------------------------------
1 L500957 L02041 UE24205 L02021
2 UE24205 L12021 7155031A DUMMY---(错误,L500957下没有子层代码为L12021的子层)
2 UE24205 L02021 7155031A DUMMY
1 L500957 L02041 7155031A DUMMY
1 L500958 L12041 UE24205 L12021
2 UE24205 L12021 7155031A DUMMY
2 UE24205 L02021 7155031A DUMMY
1 L500958 L12041 UE24205 L02021
2 UE24205 L12021 7155031A DUMMY--(重复数据)
2 UE24205 L02021 7155031A DUMMY--(重复数据)
1 L500958 L12041 7155031A DUMMY希望得到的结果为:LV       父层     父层代码 子层     子层代码
---------------------------------------------
1 L500957 L02041 UE24205 L02021
2 UE24205 L02021 7155031A DUMMY
1 L500957 L02041 7155031A DUMMY
1 L500958 L12041 UE24205 L12021
2 UE24205 L12021 7155031A DUMMY
2 UE24205 L02021 7155031A DUMMY
1 L500958 L12041 UE24205 L02021
1 L500958 L12041 7155031A DUMMY请问语句应该怎么写,谢谢各位英雄了

解决方案 »

  1.   

    1、父层代码前两位为‘L1’时,子层代码的前两位可以为‘L0’或‘L1’
    2、父层代码前两位为‘L0’时,子层代码的前两位只能为‘L0’
    3、子层代码为‘DUMMY’时是最底层的子层,不受1、2两个条件限制这些是SQL的限制条件?
      

  2.   

    SELECT LEVEL AS LV,父层,父层代码,子层,子层代码 FROM WEBSKY.TEST111
    start with 父层 like 'L500%'
    connect by prior 子层=父层 and prior 子层代码=父层代码这样就可以拉!
      

  3.   

    代码是不等的,条件如下:
    1、父层代码前两位为‘L1’时,子层代码的前两位可以为‘L0’或‘L1’
    2、父层代码前两位为‘L0’时,子层代码的前两位只能为‘L0’
    3、子层代码为‘DUMMY’时是最底层的子层,不受1、2两个条件限制
      

  4.   

    LV       父层     父层代码 子层     子层代码
    ---------------------------------------------
    1 L500957 L02041 UE24205 L02021
    2 UE24205 L02021 7155031A DUMMY
    1 L500957 L02041 7155031A DUMMY
    1 L500958 L12041 UE24205 L02021
    2 UE24205 L02021 7155031A DUMMY
    1 L500958 L12041 UE24205 L12021
    2 UE24205 L12021 7155031A DUMMY
    1 L500958 L12041 7155031A DUMMY这是我用这句sql运行出来的结果:SELECT LEVEL AS LV,父层,父层代码,子层,子层代码 FROM WEBSKY.TEST111
    start with 父层 like 'L500%'
    connect by prior 子层=父层 and prior 子层代码=父层代码
      

  5.   

    这条数据
    1 L500958 L12041 UE24205 L02021
    会满足
    connect by prior 子层=父层 and prior 子层代码=父层代码
    吗?
      

  6.   

    你用
    start with 父层 like 'L500%'
    当然会满足拉!所有父层 以'L500'开始的都满足。
      

  7.   

    如果在当中出现父层代码为L1开头,子层代码为L0开头的呢?start with 父层 like 'L500%'就没有用了,层次是好几层的
      

  8.   

    不会,不管什么开头,只要存在层次都能拿出来,因为是
    connect by prior 子层=父层 and prior 子层代码=父层代码。
    楼主你试试看。
      

  9.   

    楼上的还没明白我的意思我的意思是父层代码为L0开头的,子层代码为L1开头的,即使存在层次关系也不被显示出来,但父层代码为L1开头的,子层代码为L0L1都可。
    L0L1是区分税别的,也就是说保税父层下不能存在增税子层,而增税父层下可以存在增税与保税的子层,所以,子层代码=父层代码 不行
      

  10.   

    我明白。父层代码L0开始的下层就不能存在L1。对不对啊?
    楼主,你插入数据时
    insert into test111(父层,父层代码,子层,子层代码)VALUES('L500957','L02041','UE24205','L02021')
    insert into test111(父层,父层代码,子层,子层代码)VALUES('UE24205','L12021','7155031A','DUMMY')
    insert into test111(父层,父层代码,子层,子层代码)VALUES('UE24205','L02021','7155031A','DUMMY')
    第一条insert是父层,代码是L0开始的,但通过
    connect by prior 子层=父层 and prior 子层代码=父层代码 来connect父子层。所以只有你在加一句
    insert into test111(父层,父层代码,子层,子层代码)VALUES('L500957','L02041','UE24205','L12021')-------子层代码为L1才会选错。
    但你插入的数据是没错的,所以不可能会出现父层L0而子层L1的。这时你可以在插入数据时处理,不让插错。或者用pl/sql在查询时判断。