数据库表如下: area_id area_name area_level parent_id 1 辽宁 省级 null2 吉林 省级 null3 黑龙江 省级 null 4 沈阳 市级 15 大连 市级 16 鞍山 市级 17 长春 市级 28 延边 市级 29 哈尔滨 市级 310 大庆 市级 311 佳木斯 市级 312 伊春 市级 313 瓦房店 县级 514 普兰店 县级 515 庄河 县级 516 甘井子区 区级 517 砬子山村 村级 16 查询的结果如下: area_id area_name area_level root 1 辽宁 省级 12 吉林 省级 23 黑龙江 省级 3 4 沈阳 市级 15 大连 市级 16 鞍山 市级 17 长春 市级 28 延边 市级 29 哈尔滨 市级 310 大庆 市级 311 佳木斯 市级 312 伊春 市级 313 瓦房店 县级 114 普兰店 县级 115 庄河 县级 116 甘井子区 区级 117 砬子山村 村级 1
请问这个查询应该如何实现?
地区的深度未知
想了好久也搞不定~
谢谢
我觉得可以创建一个自定义函数root(parent_id,area_id),
root(in parent_id as int,in area_id as int)
declare v_parent_id int;
declare v_count int;
declare v_area_id int;
if parent_id is null then
return area_id;
end if;
if parent_id is not null then
select count(1) into v_count from tablename where area_id=parent_id;
if v_count>0 then
select parent_id,area_id into v_parent_id,v_area_id where area_id=parent_id;
return root(v_parent_id,v_area_id);
else
return area_id;
end if;
end if;
然后再进行查询:
select area_id,area_name,area_level,root(parent_id,area_id) as root from tablename
order by area_id
WITH TMP(ID,NAME,LEVEL,PARENT) AS ( SELECT AREA_ID,AREA_NAME,AREA_LEVEL,COALESCE(PARENT_ID,AREA_ID,PARENT_ID) FROM DB2ADMIN.PROVINCECITY WHERE PARENT_ID IS NULL UNION ALL SELECT AREA_ID,AREA_NAME,AREA_LEVEL,PARENT_ID FROM TMP T,DB2ADMIN.PROVINCECITY P WHERE P.PARENT_ID=T.ID ) SELECT * FROM TMP