需求:

一张表是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. Java的接口和抽象类(转发:http://www.importnew.com/18780.html)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  2. mysql 5.5 安装配置方法图文教程(转发)

    MySQL下载地址:http://dev.mysql.com/downloads/installer/ 1.首先进入的是安装引导界面 2.然后进入的是类型选择界面,这里有3个类型:Typical(典型 ...

  3. 跨域与ie浏览器的相关问题

    文章出处url:https://segmentfault.com/a/1190000002647143 产生跨域问题的原因 跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性. 跨域 ...

  4. sqlalchemy——基本操作

    以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ...

  5. Redis持久化——AOF(二)

    核心知识点: 1.AOF:以独立日志的方式记录写命令,重启时再执行命令.与RDB不同的是解决数据持久化的实时性,可以记录所有写操作. 2.AOF工作流程:写入命令.文件同步.文件重写.文件加载. 3. ...

  6. 用Pythonic方式来思考

    一门语言的编程习惯是由用户来确立的.这些年来,Python开发者用Pythonic这个形容词来描述那种符合特定风格的代码. 这种Pyhtonic风格,既不是严密的规范,也不是由编译器强加给开发者的规则 ...

  7. mysql用户和权限管理(Linux系统下)

    在mysql自带的库中有一个mysql,这个库包含了太多的东西,其中有一张表user,这张表存储了所有的用户信息. mysql> select user,host,password from u ...

  8. c/c++ 输入输出技巧

    C: 小数的四舍五入问题 小数用 %.xf 输出的话 是会自动四舍五入的 比如说 double e = 2.718, c = 3.141; printf("%.2lf\n", e) ...

  9. Win7打开新的文件夹总会以新窗口的形式打开

    首先可以在 组织-->文件夹和搜索选项   中设置“在同一窗口中打开每个文件夹” 如果设置后不起作用还可以 管理员方式执行以下两条命令 在开始菜单-运行中输入regsvr32 "%Sy ...

  10. poj 1065 Wooden Sticks 【贪心 新思维】

    题目地址:http://poj.org/problem?id=1065 Sample Input 3 5 4 9 5 2 2 1 3 5 1 4 3 2 2 1 1 2 2 3 1 3 2 2 3 1 ...