需求:

一张表是APP表,结构如下:

  

app_category为该游戏所属的类别ID,xml字段类型

另一张表是类别表,就ID对应名称,这就不上图了。

还有一张表是每个游戏的下载记录,结构如下:

  

DownLogs_APPId为对应的游戏

那么需求来了,要查询游戏的下载记录,查询字段中要有游戏的所属类别名称,多个用逗号分隔

查询结果应如下:

最终的执行语句如下:

select  APP_Id,APP_Name,LEFT(App_Category,len(App_Category)-1) as App_Category,DownLogs_IMEI,DownLogs_AddTime from (  ----5
select APP_Id,APP_Name,DownLogs_IMEI,DownLogs_AddTime,( -----4
select Category_Title+',' from tbl_Category where Category_Id in( ----2
select T.C.value('.','nvarchar(5)') as ss from tbl_APP as app cross apply app.APP_Category.nodes('/id') as T(C) where app_id=tbl_DownLogs.APP_Id) for xml path('') ----1
) as App_Category from (
select APP_Id,APP_Name,APP_Category,DownLogs_IMEI,DownLogs_AddTime from tbl_APP right join tbl_Download_Logs on tbl_APP.APP_Id= tbl_Download_Logs.DownLogs_APPId ----3
) as tbl_DownLogs
) as T

下面一步步分解

No.1

select T.C.value('.','nvarchar(5)') as ss from tbl_APP as app cross apply app.APP_Category.nodes('/id') as T(C)  where app_id=tbl_DownLogs.APP_Id

  这一句是将xml类型转换为行,示例:

  注意后面的where条件:app_id=tbl_DownLogs.APP_Id,这个是重点,总感觉怪怪的

No.2

select Category_Title+',' from tbl_Category where Category_Id in
.....

  这句的功能是将上面的类别ID行使用in来查找对应的title,并使用for xml path('') 来合并为一列,因为是用逗号分隔,所以结尾是会多个一个逗号,这个最后再处理

No.3

select APP_Id,APP_Name,APP_Category,DownLogs_IMEI,DownLogs_AddTime from tbl_APP right join tbl_Download_Logs on tbl_APP.APP_Id= tbl_Download_Logs.DownLogs_APPId

  普通的连接查询,查出游戏和下载记录:

  

No.4

  这就将所需的字段全部查询出来:

  

No.5

  

select  APP_Id,APP_Name,LEFT(App_Category,len(App_Category)-1) as App_Category,DownLogs_IMEI,DownLogs_AddTime from (

  前面说了,类别字段后面会多个逗号,所以这一步就是去掉最后面的逗号

最终大功告成

  

记一次SQL xml字段关联查询的更多相关文章

  1. 图解SQL多表关联查询

      图解SQL多表关联查询     网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习  内连接     左连接     右连接       全外连接   1. 查两表关联列相等的数据 ...

  2. SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响

    现有两表A(大).B(小)作关联查询,SQL语句如下: SQL1:select * from A,B where A.id = B.id SQL2:select * from A,B where B. ...

  3. 关于 XML 字段内容查询

    找到个总结相当好的知识点的归纳,记在自己的博客里也方便查询 /* sql xml 入门:     --by jinjazz     --http://blog.csdn.net/jinjazz     ...

  4. mybatis mapper.xml 写关联查询 运用 resultmap 结果集中 用 association 关联其他表 并且 用 association 的 select 查询值 报错 java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mybatis.map

    用mybaits 写一个关联查询 查询商品表关联商品规格表,并查询规格表中的数量.价格等,为了sql重用性,利用 association 节点 查询 结果并赋值报错 商品表的mapper文件为Gooo ...

  5. SQL三表左关联查询

    今天在开发的时候遇到了一个需求就是三遍关联查询,表A包含有表B和表C的uid,然后使用left join左关联查询: SELECT c.`uid`, `fromuseruid`, `touseruid ...

  6. 【SSM sql.xml】日志查询mapper.xml

    LogInfoMapper.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapp ...

  7. sql 单个字段去重查询 distinc 和 group by的效率问题

    sql 查询 distinc用法 distinct 和group by都需要排序,一样的结果集从执行计划的成本代价来看差距不大,但group by 还涉及到统计,所以应该需要准备工作.所以单纯从等价结 ...

  8. SQL多表关联查询

        在创建关系型数据表时,根据数据库范式的要求,为了降低数据的冗余,提供数据维护的灵活性 将数据分成多个表进行存储,实际工作当中,需要多个表的信息,需要将多个表合并显示   --内连接 selec ...

  9. sql 同一个字段在查询结果中出现两次

    SELECT GET .daytime,    GET.data AS GET,    xh.data AS xh FROM    ( SELECT daytime, SUM ( get_sum ) ...

随机推荐

  1. C#练习委托、事件、事件处理

    控制台应用程序效果: 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  2. 用Visual Studio编辑Linux代码

    估计很多人都是用惯了Visual Studio的主,怎么也不适应Linux的一套编辑器,比如vim.source insight这些东西,可视化的eclipse效果还好点,但一般以远程共享一台Linu ...

  3. CSS选择器(二)

    五.属性选择器. 属性选择器可以根据元素的属性及属性值来选择元素. 简单属性选择 如果希望选择有某个属性的元素,而不论属性值是什么,可以使用简单属性选择器. 例子 1 如果您希望把包含标题(title ...

  4. 每天一个Linux命令(30)ln命令

    ln命令用来为文件创建链接,连接类型分为硬链接和符号链接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.   (1)用法: 用法:  ln  [options ...

  5. spring AOP简单实现代码存放

    @Before:使用Before增强处理只能在目标方法执行之前织入增强,如果Before增强处理没有特殊处理,目标方法总会自动执行,如果Before处需要阻止目标方法的执行,可通过抛出一个异常来实现. ...

  6. DEV开发之控件NavBarControl

    右键点击RunDesigner弹出如下界面鼠标先点击3或4,1,,然后点击1或2进行相应的新增或删除操作,3是分组,4是项目,4可以直接拖动到相应的分组3.属性caption:显示的名称4.NavBa ...

  7. castle windsor学习-----XML Inline Parameters 内联参数

    当使用XML配置的时候,可能要给组件指定各种各样的依赖 1.简单的参数 参数名称不区分大小写 <component id="ping" type="Acme.Crm ...

  8. POJ 2253 Frogger(warshall算法)

    题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...

  9. MySQL--开发技巧(一)

    Inner Join: Left Outer Join: Right Outer Join: Full Join: Cross Join: SELECT t1.attrs ,t2.attrs FROM ...

  10. codeforces 710B B. Optimal Point on a Line(数学)

    题目链接: B. Optimal Point on a Line 题意: 给出n个点,问找出一个点使得这个点到所有的点的距离和最小; 思路: 所有点排序后的中位数;这是一个结论; AC代码: #inc ...