博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql 语句小课堂4:统计所属分类及其子分类的内容
阅读量:4162 次
发布时间:2019-05-26

本文共 7087 字,大约阅读时间需要 23 分钟。

一个很常见的场景,一个文章信息,具有一个地域信息,比如北京,比如上海,比如长沙,有时候,地域信息则更为细致,比如昌平,比如浦东,比如集安,而我们需要统计所有指定地域的信息,比如广东,比如河北,比如四川

而现在,我们有两种处理方式

方法一:物理存储

在我们插入或修改信息时,生成对应信息的冗余数据,比如存储的信息时通州,那么我们在冗余表里记录上通州的ID,同时记录出北京的ID

这个好处是效率较高

方法二:递归生成ID列

比如我们查北京地区,那么不能只查北京ID的,还要把大兴、密云什么的ID也列出来然后去in也好,inner join也好,cross也好,都可以实现,但是相对来说效率较低

假设有地域表cities

city_id     city_name                                          city_parent----------- -------------------------------------------------- -----------1           北京                                                 02           天津                                                 03           上海                                                 04           重庆                                                 05           河北                                                 06           山西                                                 07           辽宁                                                 08           吉林                                                 09           黑龙江                                                010          内蒙古                                                011          江苏                                                 012          浙江                                                 013          安徽                                                 014          福建                                                 015          江西                                                 016          山东                                                 017          湖北                                                 018          湖南                                                 019          广东                                                 020          海南                                                 021          广西                                                 022          河南                                                 023          四川                                                 024          贵州                                                 025          云南                                                 026          西藏                                                 027          陕西                                                 028          甘肃                                                 029          青海                                                 030          宁夏                                                 031          新疆                                                 032          香港                                                 033          澳门                                                 034          台湾                                                 0213         东城区                                                1214         西城区                                                1217         朝阳区                                                1218         海淀区                                                1219         丰台区                                                1220         石景山区                                               1221         房山区                                                1222         通州区                                                1223         顺义区                                                1224         门头沟区                                               1225         昌平区                                                1226         大兴区                                                1227         怀柔区                                                1228         平谷区                                                1229         密云区                                                1230         延庆区                                                1232         和平区                                                2233         河东区                                                2234         河西区                                                2235         南开区                                                2236         河北区                                                2237         红桥区                                                2241         东丽区                                                2242         西青区                                                2243         北辰区                                                2244         津南区                                                2245         武清区                                                2246         宝坻区                                                2247         静海区                                                2248         宁河区                                                2249         蓟州区                                                23651        滨海新区                                               21581        黄浦区                                                31583        徐汇区                                                31584        长宁区                                                31585        静安区                                                31586        普陀区                                                31588        虹口区                                                31589        杨浦区                                                31590        闵行区                                                31591        宝山区                                                31592        嘉定区                                                31593        浦东新区                                               31594        金山区                                                31595        松江区                                                31596        青浦区                                                31598        奉贤区                                                31599        崇明区                                                31604        渝中区                                                41605        大渡口区                                               41606        江北区                                                4

按照方法二,选择所有北京的文章,语句如下

with t as (	select city_id,city_name,city_parent 	from cities ),t1 as (	select * from t where city_id=1	union all	select a.* from t a,t1 b where a.city_parent=b.city_id)select * from news where city in (select city_id from t1)

而方法一,则需要触发器来进行一下支持

假设有地域查询冗余表news_city(id int identity,city int,newsid int)

那么触发器里应该根据cities表,获得地域及其所有父级id插入到这个冗余表中

然后筛选语句为

select * from news awhere exists(select top 1 1 from news_city where newsid=a.id and city=1)

比如,ID为1的文章内,地域字段是石景山(220),那么news_city内应该有两条信息

city      newsid--------  --------1         1220       1

那么,触发器该怎么写呢,其实也很简单

CREATE TRIGGER extract_city -- 触发器名称   ON news                  -- 表名称   AFTER INSERT,DELETE,UPDATEAS BEGIN	SET NOCOUNT ON;    delete from news_city where newsid in (select id from deleted)    with t1 as (	    select a.id,a.city,b.city_parent from inserted a	    cross apply (		    select city_parent from cities where city_id=a.city	    ) b 	    union all	    select a.id,b.city_id,b.city_parent from t1 a	    inner join dict_cities b on a.city_parent=b.city_id    )    insert into news_city(city,newsid)    select id,city from t1END

在更新或删除时,清除相关文章的地域冗余信息

在更新或插入时,从新插入新的相关冗余信息

如此,我们便可以方便的查询分类及其子类的相关内容了

转载地址:http://axvxi.baihongyu.com/

你可能感兴趣的文章
三大隐忧 三星未来路在何方?
查看>>
linux下各种进制转化最简单的的命令行
查看>>
结构体和联合体
查看>>
ACM(Association for Computing Machinery )组织的详细介绍
查看>>
unix高级编程之-命令行参数(实践一)
查看>>
无线网络加密方式对比 .
查看>>
linux中cat命令使用详解
查看>>
卸载oracle
查看>>
hive 自定义函数jar发布的方法
查看>>
对DMA传输机制的学习
查看>>
QT中this指针
查看>>
java中的异常机制
查看>>
java SE面向对象思维导图
查看>>
三维分析之视频投放
查看>>
SuperMap iDesktop之栅格值怎么查
查看>>
SuperMap iClient3D for WebGL教程-orientation
查看>>
SuperMap iClient3D for WebGL教程-description描述属性
查看>>
SuperMap iClient3D for WebGL教程-CallbackProperty
查看>>
如何修改leaflet聚合图的层级和样式
查看>>
三维分析之开敞度分析
查看>>