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
MSSQL数据库一对多和多对一查询的转换的更多相关文章
- mybatis(一、原理,一对多,多对一查询)
MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...
- SpringBoot使用Mybatis注解进行一对多和多对多查询(2)
SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地 ...
- Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询
一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...
- day03-Mybatis中一对一、一对多、多对多查询
一对一查询 一对一的表结构: my_account表: my_user表: 一对一是互相的,A可以找到B,B也可以找到A,方法是一样的,这里就只写一个方向的 通过my_count表找到my_user表 ...
- MySQL数据库 crud语句 ifnull() 创建新账户 备份数据库 一对多关系 多对多(中间表) 外键约束 自关联 子查询注意事项 DML DDL DQL mysql面试题 truncate与delete的区别
DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL ...
- Mybatis一对一、一对多、多对多查询。+MYSQL
场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...
- mybatis+oracle实现一对多,多对一查询
首先创建表 学生表 create table stu( id number(11) primary key, name varchar2(255), age num ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
随机推荐
- partial conv
Image Inpainting for Irregular Holes Using Partial Convolutions pytorch代码 论文贡献: 提出了部分卷积(partial conv ...
- cJSON的使用
1 安装cJSON github地址:https://github.com/DaveGamble/cJSON.git 下载完成后进入cJSON目录,执行下面命令生成Makefile文件 mkdir b ...
- linux离线安装docker + docker-compose
1 准备阶段(docker) 1.1 卸载旧版本 如果电脑上已经存在docker,需要先卸载可能存在的旧版本: 1. 删除某软件,及其安装时自动安装的所有包 sudo apt-get autoremo ...
- MySQL索引(二):建索引的原则
在了解了索引的基础知识及B+树索引的原理后(如需复习请点这里),这一节我们了解一下有哪些建索引的原则,来指导我们去建索引. 建索引的原则 1. 联合索引 我们可能听一些数据库方面的专业人士说过:&qu ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- PyQt(Python+Qt)学习随笔:QDockWidget停靠部件的allowedAreas属性
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 QDockWidget的allowedAreas属性用于控制停靠部件在 ...
- 第14.6节 使用Python urllib.request模拟浏览器访问网页的实现代码
Python要访问一个网页并读取网页内容非常简单,在利用<第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头>的方法构建了请求http报文的请求头情况下,使 ...
- Node.js 应用---定时给自己发送邮件
参照传智播客的视频所写代码. js代码: //引用superagent包,用于服务器发送http请求 const request = require('superagent'); //导入cheeri ...
- 简单且实用的关闭当前应用的auto.js 代码
function closeCurrentPackage() { // 可以稍加修改,关闭指定app let packageName = currentPackage(); app.openAppSe ...
- pandas 获取列名
df.columns.values df.columns.values.tolist()