SQL Server为例
with cte as ( select * from B where [parentid]=0 union all select a.[areaid],a.[areaname],case when b.[parentid]=0 then b.[areaid] else b.[parentid] end from B a join cte b on a.[parentid]=b.[areaid] ) select C.[areaname],COUNT(0) from cte C left join cte b on C.[areaid]=b.[parentid] left join A on A.[areaid]=B.[areaid] OR A.[areaid]=C.[areaid] where C.[parentid]=0 AND A.ID IS NOT NULL GROUP BY C.[areaname]
f非常感谢,解决了我的问题.现在就是CTE增加了2个显示字段经度和纬度.这样子查询时间就固定2秒钟,不知道为何.目前我在A表加数据查询结果用时2秒钟.但是我把CTE增加的这2个字段删除,查询结果用时就在1秒内出来.
还行感谢帮我解决了问题.
需求全靠猜测是吧? 写得不明不白的,就得靠脑补了。
你写清楚数据表A和B的结构以及数据,这问题就很简单,随便找个懂SQL的人都能回答你。
x谢谢,需求我写的详细一些了.麻烦有时间看下.
@白了头发就是代价:
三种解决方案
1、修改数据表结构,在地区表B中添加足够的冗余字段,可以减少SQL查询的复杂度。
2、使用CTE(请自行Google SQL Server CTE),可以在SQL中进行递归查询
3、使用很复杂的SQL查询
举例说明
分解复杂查询为简单查询
a. 找到所以一级地区
select distinct left(areaid,3),areaname from regions where parentID=0
这样可以得到
100, 北京
200, 湖北
b. 地区号一般有截断,比如前三位,或者前四位之类的,我不清楚你的具体规则,只能先假设前三位是唯一的。
Select count(id), left(areaid,3) from TableA group by left(areaid)
这样得到
2, 100
2, 200
c. 你把上面两个查询连接起来就行了。
第三个方法是下下策,查询速度会比较慢,不过这种表一般不会太多数据,所以勉强能用。
用“group by”吧