有一表(三个字段)Km_id,Km_name,flag(bit型) 假设有如下数据:
101  现金
102  银行存款
102001  工行
102002  XXX
103     XXXXX
104     AAAAAA
...     .......
怎样通过一个update 语句实现将最低级科目的标志flag赋值-1(默认为0,参考字段为km_id),其中的关键字段为km_id
更新后的数据如:
101  现金        -1
102  银行存款     0
102001  工行     -1
102002  XXX      -1
103     XXXXX    -1
104     AAAAAA   ..
...     .......   ..

解决方案 »

  1.   

    什么样的是最低级科目依你上面的数据
    update tablename set flag = -1 where km_id <> '102' ;你用where km_id not in ( '102',....)
    或km_id >....,     km_id <...都可以
      

  2.   

    to lws0472:谢谢
      可能你理解错了,也有可能是我给的数据误导了你
      最低级科目必须满足条件,km_id 不能存在如下关系:
      如果有km_id ='101',则只要存在km_id='101%'均不是最低级科目
      //%为通配符
      而且表中的数据并不一定是我列举的那样,可能数据如下:
    1011  现金        
    1021  银行存款     
    10021001  工行     
    1021002  XXX      
    1031     XXXXX    
    1041     AAAAAA   
    ...     .......   
    那又该如何呢!也就是说where 后面的条件不能是特定的值
      

  3.   

    是不是以101开头的都不是
    那就在条件中试一下吧,查找左三个字符是101的吧。
    你用的是什么数据库,对应的函数不一样。。
    在vfp中有%通配符,和left()
    update  tablename set flag=-1  where left(km_id,3)<>"101"
    或者用substring(km_id from 1 to 3)<>"101"   这个函数是delphi数据库的
      

  4.   

    to boomit:谢谢先
      我使用的是Sql Server ,其条件不一定是'101'开头的,应该是km_id中的值必须满足该值如果在其它条记录中不存在包含关系(%,尾部)才赋值-1,否则为0,如同将班级中姓名中前面部分或全部相同的归为0,只有前面部分或全部完全不相同才为-1
      

  5.   

    to : gao277(流氓状元):怎么写呢?给点提示!
      

  6.   

    如果你用的是Access数据库应该这样写,
    update tablename set flag = -1 where len(km_id)>3
      

  7.   

    to SQL5560(末日之刃.EXE) :
    最低级科目必须满足该值如果在其它条记录中不存在包含关系(%,尾部)才赋值-1,否则为0,如同将班级中姓名中前面部分或全部相同的归为0,只有前面部分或全部完全不相同才为-1
      

  8.   

    update tablename a set flag = -1 where exists(select 1 from tablename b where b.km_id=substr(a.km_id,length(a.km_id)-3,length(a.km_id)))
    或者
    update tablename a set flag = -1 where .a.(select 1 from tablename b where b.km_id=substr(a.km_id,length(a.km_id)-3,length(a.km_id)))
      

  9.   

    或者
    update tablename a set flag = -1 where substr(a.km_id,length(a.km_id)-3,length(a.km_id)))
    in(select b.km_id from tablename b where b.km_id=substr(a.km_id,length(a.km_id)-3,length(a.km_id)))
      

  10.   

    TO  3yugui(亿硅):
    谢谢先,需要说明的是,KM_ID的长度,也就是说length(a.km_id)-3这个条件不一定存在!
      

  11.   

    试式这个语句:
    UPDATE KM A
       SET FLAG = -1
    WHERE NOT EXISTS(
    SELECT * FROM KM B
    WHERE SUBSTRING(B.KM_ID,1,LENGTH(A.KM_ID)) = A.KM_ID
      AND LENGTH(B.KM_ID) > LENGTH(A.KM_ID))
    KM_ID必须是一个字符型字段
      

  12.   

    to  shiboq(湿雨) 
    试了试如下数据
    km_id             km_name           flag
    1          1          0         
    102        2          0         
    101001     2          0         
    0          3          0        
    0          1          0         
    执行之后变成
    1          1          -1         
    102        2          -1         
    101001     2          -1         
    0          3          -1         
    0          1          -1   
    而我要的结果是:
    1          1          0         
    102        2          -1         
    101001     2          -1         
    0          3          0         
    0          1          0