首页 新闻 会员 周边 捐助

sql查询.联动查询,请大神们帮忙指导下

0
[已解决问题] 解决于 2017-04-27 21:54

数据表A 基础数据表.里面有地区ID和地区表关联 结构如下:

ID   name  areaid

1  张三  10001

2  李四  20001

3  王五  20002

4  赵六  10002

地区表B 结构如下:

(areaid,areaname,parentid)

10000  北京  0

10001  宣武  10000

10002  西城  10000

20000  湖北  0

20001  武汉  20000

20002  青三区 20001

 

需得到结果

地区   总计

北京    2

湖北    2

 

谢谢各位大神了~~

白了头发就是代价的主页 白了头发就是代价 | 初学一级 | 园豆:7
提问于:2017-04-21 15:55
< >
分享
最佳答案
0

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]
奖励园豆:5
Jimmy.pan | 菜鸟二级 |园豆:242 | 2017-04-24 14:25

f非常感谢,解决了我的问题.现在就是CTE增加了2个显示字段经度和纬度.这样子查询时间就固定2秒钟,不知道为何.目前我在A表加数据查询结果用时2秒钟.但是我把CTE增加的这2个字段删除,查询结果用时就在1秒内出来.

还行感谢帮我解决了问题.

白了头发就是代价 | 园豆:7 (初学一级) | 2017-04-24 20:04
其他回答(2)
0

需求全靠猜测是吧? 写得不明不白的,就得靠脑补了。

你写清楚数据表A和B的结构以及数据,这问题就很简单,随便找个懂SQL的人都能回答你。

爱编程的大叔 | 园豆:30844 (高人七级) | 2017-04-21 16:40

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. 你把上面两个查询连接起来就行了。

 

第三个方法是下下策,查询速度会比较慢,不过这种表一般不会太多数据,所以勉强能用。   

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2017-04-24 10:25
0

用“group by”吧

狼爷 | 园豆:1204 (小虾三级) | 2017-04-22 09:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册