前言

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

(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

MSSQL数据库一对多和多对一查询的转换的更多相关文章

  1. mybatis(一、原理,一对多,多对一查询)

    MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...

  2. SpringBoot使用Mybatis注解进行一对多和多对多查询(2)

    SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...

  3. Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询

    一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...

  4. mybatis学习记录六——一对一、一对多和多对多查询

    9       订单商品数据模型 9.1     数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...

  5. day03-Mybatis中一对一、一对多、多对多查询

    一对一查询 一对一的表结构: my_account表: my_user表: 一对一是互相的,A可以找到B,B也可以找到A,方法是一样的,这里就只写一个方向的 通过my_count表找到my_user表 ...

  6. MySQL数据库 crud语句 ifnull() 创建新账户 备份数据库 一对多关系 多对多(中间表) 外键约束 自关联 子查询注意事项 DML DDL DQL mysql面试题 truncate与delete的区别

    DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL ...

  7. Mybatis一对一、一对多、多对多查询。+MYSQL

    场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...

  8. mybatis+oracle实现一对多,多对一查询

    首先创建表 学生表 create table stu(       id number(11) primary key,       name varchar2(255),       age num ...

  9. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

随机推荐

  1. SpringBoot2整合Redis

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. 【mq读书笔记】消息确认(失败消息,定时队列重新消费)

    接上文的集群模式,监听器返回RECONSUME_LATER,需要将将这些消息发送给Broker延迟消息.如果发送ack消息失败,将延迟5s后提交线程池进行消费. 入口:ConsumeMessageCo ...

  3. gradle插件版本号和Gradle版本号对应关系

    Plugin version Required Gradle version 1.0.0 - 1.1.3 2.2.1 - 2.3 1.2.0 - 1.3.1 2.2.1 - 2.9 1.5.0 2.2 ...

  4. secret_key伪造session来进行越权

    从swpuctf里面的一道ctf题目来讲解secret_key伪造session来进行越权. 以前没有遇到过这种题目,这次遇到了之后查了一些资料把它做了出来,记录一下知识点. 参考资料 http:// ...

  5. 精品软件-OfficeBox办公神器

    办公文档office处理套件,非常齐全,小巧! 官方地址:http://www.wofficebox.com/

  6. Scrum冲刺_Day03

    一.团队展示: 1.项目:light_note备忘录 2.队名:删库跑路队 3.团队成员 队员(不分先后) 项目角色 黄敦鸿 后端工程师.测试 黄华 后端工程师.测试 黄骏鹏 后端工程师.测试 黄源钦 ...

  7. CF1000F One Occurrence

    本题解用于记录一下一个优秀的东西--懒标记. 题解 可以很轻易的想到莫队的做法,但是题目让你输出的是满足条件的一个数,而不是满足条件的数的个数,似乎很难去 \(O(1)\) 转移.这个时候我们的懒标记 ...

  8. 题解-[NOI2005]瑰丽华尔兹

    题解-[NOI2005]瑰丽华尔兹 [NOI2005]瑰丽华尔兹 \(n\times m\) 的矩阵.以 \((x,y)\) 为起点.一共 \(k\) 段时间,每段时间为 \([s_i,t_i](t_ ...

  9. 算法—— n个骰子的点数

    把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个 ...

  10. html标签学习1

    html:超文本标记语言 超文本标记语言的结构包括"头"部分(英语:Head).和"主体"部分(英语:Body),其中"头"部提供关于网页的 ...