zoukankan      html  css  js  c++  java
  • MSSQL数据库一对多和多对一查询的转换

    前言

    处理一对多关系,有两种方式

    (1)创建关系表,将对应关系保存在物理表中。

    (2)表中添加一个字段,将多关系的值以特殊符号隔开进行保存.

    本例使用的就是,以逗号隔开(InterestID='1,2,3,4')

    示例语句

    测试数据表的创建语句

    --学生表
    CREATE table Student
    (
    Name nvarchar(50),--姓名
    InterestID varchar(50)--兴趣编号
    )
    --基础信息表
    CREATE table BaseInfo
    (
    InterestID int,--兴趣编号
    InterestName varchar(10)--兴趣名称
    )
    
    --测试数据
    insert INTO BaseInfo
    SELECT 1,'乒乓球'
    UNION
    SELECT 2,'篮球'
    UNION
    SELECT 3,'足球'
    UNION
    SELECT 4,'网球'
    UNION
    SELECT 5,'羽毛球'
    
    --一对多关系示例数据
    INSERT INTO Student
    SELECT '李健康','1,3,4'
    UNION
    SELECT '方时赫','2'
    
    --一对一关系示例数据
    INSERT INTO Student
    SELECT 'Mike','1'
    UNION
    SELECT 'Mike','2'
    UNION
    SELECT 'Mike','4'

    查询方式

    (1)字段中保存多个值(一条记录对应多条记录),关联仍为一条数据

    SELECT a.Name,a.InterestID
    ,InterestName=
    STUFF
    (
        (
            SELECT ','+LTRIM(b.InterestName)
            FROM BaseInfo b        
            WHERE CHARINDEX(','+LTRIM(b.InterestID),','+a.InterestID)>0 FOR XML PATH('')
        )
        ,1,1,''
    )
    FROM Student a

    原结果集:

    Name    InterestID
    李健康    1,3,4
    方时赫    2

    关联结果集:

    Name    InterestID    InterestName
    李健康    1,3,4       乒乓球,足球,网球
    方时赫    2        篮球

    (2)字段中保存多个值(一条记录对应多条记录),关联为多条数据

    SELECT x.Name,y.InterestID FROM
    (                                   
          SELECT Name
        ,InterestID = CONVERT(xml,'<root><v>' + REPLACE(InterestID, ',', '</v><v>') + '</v></root>')
        FROM Student
    ) x
    OUTER APPLY
    (
      SELECT InterestID = N.v.value('.', 'varchar(100)') FROM x.InterestID.nodes('/root/v') N(v)
    ) y

    原结果集:

    Name    InterestID
    李健康    1,3,4
    方时赫    2

    关联结果集:

    Name    InterestID
    李健康    1
    李健康    3
    李健康    4
    方时赫    2

    (3)字段中保存一个值,关联为一对多的关系

    select Name,
    stuff
    (
        (  
        select ','+ InterestID from Student as b where b.Name = a.Name for xml path('')
        )
        ,1,1,''
    ) as InterestID
    from Student as a  
    group by Name

    原结果集:

    Name    InterestID
    李健康    1,3,4
    方时赫    2
    Mike       1
    Mike       2
    Mike       4

    关联结果集:

    Name      InterestID
    Mike       1,2,4
    方时赫    2
    李健康    1,3,4

  • 相关阅读:
    函数依赖(转)
    C++对象的深拷贝和浅拷贝
    C++临时匿名对象
    C++操作符重载
    C数组和指针
    动态开发入门之Servlet
    数据库的CURD操作 以及经典的sql语句
    如何删除07版word页眉页脚的横线
    数据库的连接查询
    经典面试题 详细解析Java中抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/masonblog/p/8818951.html
Copyright © 2011-2022 走看看