有一个表
UUID XUHAO PRICE
1 3 140
2 3.1 140
3 3.1.1 50
4 3.1.1.1 20
5 3.1.1.2 30
6 3.1.2 90
7 3.1.2.1 40
8 3.1.2.2 50
9 4 136
10 4.1 70
11 4.2 66
12 5 90
要求写一个SQL语句,得到如下的数据
UUID XUHAO PRICE
4 3.1.1.1 20
5 3.1.1.2 30
7 3.1.2.1 40
8 3.1.2.2 50
10 4.1 70
11 4.2 66
12 5 90附创建表的脚本及测试数据
CREATE TABLE TABLE1
(
  UUID   VARCHAR2(20 BYTE),
  XUHAO  VARCHAR2(20 BYTE),
  PRICE  NUMBER(10,2)
)Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('001', '3', 140);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('002', '3.1', 140);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('003', '3.1.1', 50);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('004', '3.1.1.1', 20);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('005', '3.1.1.2', 30);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('006', '3.1.2', 90);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('007', '3.1.2.1', 40);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('008', '3.1.2.2', 50);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('009', '4', 136);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('010', '4.1', 70);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('011', '4.2', 66);
Insert into TABLE1
   (UUID, XUHAO, PRICE)
 Values
   ('012', '5', 90);
COMMIT;

解决方案 »

  1.   

    就是要得到叶子节点的数据咯?
    select * from table1 a
    where not exists(
      select 1 from table1 where xuhao like a.xuhao||'._')
      

  2.   

    把_改成%比较合适
    select * from table1 a
    where not exists(
      select 1 from table1 where xuhao like a.xuhao||'.%')或者
    select * from table1 a
    where connect_by_isleaf=1
    start with length(xuhao)=1
    connect by xuhao like prior xuhao||'.%'
      and xuhao not like prior xuhao||'.%.%'
    如果序号里的数字不会出现2位的话
    可以
    select * from table1 a
    where connect_by_isleaf=1
    start with length(xuhao)=1
    connect by xuhao like prior xuhao||'._'第一个比较好
      

  3.   

    结果不对?UUID XUHAO PRICE
    004 3.1.1.1 20.00
    005 3.1.1.2 30.00
    007 3.1.2.1 40.00
    008 3.1.2.2 50.00
    010 4.1 70.00
    011 4.2 66.00
    012 5 90.00不是这样的吗
      

  4.   

    select * from table1 a 
    where connect_by_isleaf=1 
    start with length(xuhao)=1 
    connect by xuhao like prior xuhao||'.%' 
      and xuhao not like prior xuhao||'.%.%' 
    呵呵,这一个在我本地运行有错,提示:ORA-00904: "CONNECT_BY_ISLEAF": 无效的标识符
    不过,你给出的第一个答案是对的,谢谢.