數據表如下:
Area 平台表:
Province 省份表:
District 區域表:
Area下級為:Province,Province下級為District
查詢出的效果如下:
功能實現如下:(使用for xml來實現功能)
第一步:
--合並區域列,將合並的數據保存到臨時表#temp_Province
select ProvinceID,ProvinceName,'{'+left(DistrictList,len(DistrictList)-1)+'}' as DistrictList,AreaID into #temp_Province
from (select ProvinceID,ProvinceName,AreaID,
isnull((select '"District'+CAST(ROW_NUMBER() over(order by District.DistrictID) as nvarchar(50))+'":{'
+ '"DistrictID":"'+cast(DistrictID as nvarchar(100))+'",'
+'"DistrictIName":"'+DistrictIName+'"},'
from District where District.ProvinceID= Province.ProvinceID for xml path('')),'"District":"",') as DistrictList
from Province)
as Province2
#temp_Province表查詢到的數據如下:
第二步:
--合並省份列 將合並的數據保存到臨時表#temp_Area
select AreaID,AreaName,'{'+left(AreaList,len(AreaList)-1)+'}' as AreaList into #temp_Area
from (select AreaID,AreaName,
isnull((select '"Province' +CAST(ROW_NUMBER() over(order by #temp_Province.ProvinceID) as nvarchar(50))+'":{'
+'"ProvinceID":"'+cast(ProvinceID as nvarchar(100))+'",'
+'"ProvinceName":"'+ProvinceName+'",'
+'"DistrictList":'+DistrictList+'},'
from #temp_Province where Area.AreaID=#temp_Province.AreaID for xml path('')),'"Province":"",') as AreaList
from Area)
as Area2
#temp_Area查詢到的數據如下:
第三步:
--合並平台列,查詢出最終的結果
select '{'+cast(stuff(
(select ',"Area'+CAST(ROW_NUMBER() over(order by #temp_Area.AreaID) as nvarchar(50))+'":{'
+'"AreaID":"'+cast(AreaID as nvarchar(100))+'",'
+'"AreaName":"'+AreaName+'",'
+'"AreaList":'+AreaList+'}'
from #temp_Area for xml path('')),1,1,'') as nvarchar(max))+'}'
第四步:
--刪除臨時表
drop table #temp_Province
drop table #temp_Area
最終查詢到的效果如下:
{"Area1":{"AreaID":"4","AreaName":"華中","AreaList":{"Province":""}},"Area2":{"AreaID":"5","AreaName":"西北","AreaList":{"Province1":{"ProvinceID":"28","ProvinceName":"陝西","DistrictList":{"District1":{"DistrictID":"210","DistrictIName":"西安"},"District2":{"DistrictID":"211","DistrictIName":"咸陽"},"District3":{"DistrictID":"363","DistrictIName":"延安"},"District4":{"DistrictID":"364","DistrictIName":"榆林"}}},"Province2":{"ProvinceID":"39","ProvinceName":"青海","DistrictList":{"District":""}}}},"Area3":{"AreaID":"6","AreaName":"華南","AreaList":{"Province1":{"ProvinceID":"14","ProvinceName":"廣西","DistrictList":{"District1":{"DistrictID":"154","DistrictIName":"玉林"}}},"Province2":{"ProvinceID":"15","ProvinceName":"海南","DistrictList":{"District1":{"DistrictID":"164","DistrictIName":"臨高縣"},"District2":{"DistrictID":"165","DistrictIName":"陵水黎族自治縣"},"District3":{"DistrictID":"171","DistrictIName":"文昌市"},"District4":{"DistrictID":"172","DistrictIName":"五指山市"},"District5":{"DistrictID":"368","DistrictIName":"海南省直轄縣"}}}}}}
得到需求要的效果:
注意:
以Area表為主表,串聯3張表:
select Area.AreaID,Area.AreaName,Province.ProvinceID,Province.ProvinceName,District.DistrictID,District.DistrictIName from Area
left join Province on Province.AreaID=Area.AreaID
left join District on District.ProvinceID=Province.ProvinceID
order by Area.AreaID,Area.AreaName,Province.ProvinceID,Province.ProvinceName,District.DistrictID,District.DistrictIName
得到如圖所示結果:
有圖可見:華中平台下是沒有省份的,西北-青海下是沒有區域的。
在創建臨時表若沒有對NULL的情況做判斷,則會有數據丟失