表是这样的
id  m_encode m_name
1   01       原材料
2   02       辅料
3   0101     化工原料
4   010101   甲苯
5   03       低值易耗品
类似这样,
如何写sql语句取出类别的最下级,也就是有下级的话取下级,没有下级的话取当前级,根据类别编码的规则?
 

解决方案 »

  1.   

    如果编码是规矩的,那就取编码长度最大的那个(当然编码要满足规定,比如是01或02开头的),比如select * from 表 where len(m_encode)=(select max(len(m_encode)) from 表)
      

  2.   

    select id,m_encode,m_name from t
    where length(m_encode)=(select max(length(m_encode)) from t where m_encode like '01%')加个where条件
      

  3.   

    select test.* from test,
    (
    select m_encode,max(length) length from 
     (select left(m_encode,2) m_encode,len(m_encode) length from  test) s
    group by m_encode
    ) g
    where left(test.m_encode,2)=g.m_encode and len(test.m_encode)=g.length
      

  4.   

    SELECT * FROM 表 A WHERE NOT EXISTS (SELECT 1 FROM 表 WHERE M_ENCODE LIKE A.M_ENCODE+'%' AND M_ENCODE<>A.M_ENCODE)
      

  5.   

    可能我表达的不是很清楚
    表是这样的
    id  m_encode m_name
    1  01      原材料
    2  02      辅料
    3  0101    化工原料
    4  010101  甲苯
    5  0102    电化铝
    6  03      低值易耗品 
    我想得到的结果是这样(有下级的话取下级,没有下级的话取当前级)
    id  m_encode m_name
    2  02      辅料
    4  010101  甲苯
    5  0102    电化铝
    6  03      低值易耗品而下级的层数是不定的,编码的原则是以2位表示一个类别,上级01,下级0101,再下级就010101,如此类推
      

  6.   

    select * from 表 a where not exists 
    (select 1 from 表 b 
      where a.m_encode=substring(b.m_encode,1,len(a.m_encode)) and b.m_encode<>a.m_encode)
      

  7.   

    IF NOT OBJECT_ID('TB') IS NULL  DROP TABLE TB
    GO
    CREATE TABLE TB([ID] INT,[M_ENCODE] NVARCHAR(6),[M_NAME] NVARCHAR(5))
    INSERT TB
    SELECT 1,N'01',N'原材料' UNION ALL
    SELECT 2,N'02',N'辅料' UNION ALL
    SELECT 3,N'0101',N'化工原料' UNION ALL
    SELECT 4,N'010101',N'甲苯' UNION ALL
    SELECT 5,N'0102',N'电化铝' UNION ALL
    SELECT 6,N'03',N'低值易耗品'
    GOSELECT * FROM TB A 
    WHERE NOT EXISTS (SELECT 1 FROM TB WHERE M_ENCODE LIKE A.M_ENCODE+'%' AND M_ENCODE<>A.M_ENCODE)/*
    ID          M_ENCODE M_NAME 
    ----------- -------- ------ 
    2           02       辅料
    4           010101   甲苯
    5           0102     电化铝
    6           03       低值易耗品(所影响的行数为 4 行)
    */