表是这样的
id m_encode m_name
1 01 原材料
2 02 辅料
3 0101 化工原料
4 010101 甲苯
5 03 低值易耗品
类似这样,
如何写sql语句取出类别的最下级,也就是有下级的话取下级,没有下级的话取当前级,根据类别编码的规则?
id m_encode m_name
1 01 原材料
2 02 辅料
3 0101 化工原料
4 010101 甲苯
5 03 低值易耗品
类似这样,
如何写sql语句取出类别的最下级,也就是有下级的话取下级,没有下级的话取当前级,根据类别编码的规则?
where length(m_encode)=(select max(length(m_encode)) from t where m_encode like '01%')加个where条件
(
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
表是这样的
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,如此类推
(select 1 from 表 b
where a.m_encode=substring(b.m_encode,1,len(a.m_encode)) and b.m_encode<>a.m_encode)
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 行)
*/