三个表的联合查询的场景分析-场景4:c表维护a和b表的id关联关系(一对多)

基础SQL演练,带详细分析,笔记和备忘。

目录

背景介绍

表数据

需求1:查询g表所有记录,以及关联的h的id

需求2:在需求1基础上,查出关联的h的其它字段(name)

需求3:在需求2基础上,按gid分组、同时把对应的多个h表的字段各自放在一起

方式1

方式2


背景介绍

共三个表,g和h表分别是各自数据、无关联关系。另有k表维护了g和h表的关联关系,内容是k中包含了g_id和h_id两个字段,这两个字段分别和g表的id、h表的id相等,且各自一一对应。

表数据

g表

h表

m表

需求1:查询g表所有记录,以及关联的h的id

select g.id gid,g.name gname,m.h_id hidfrom demo_gs g left join demo_ms  mon m.g_id = g.id

结果

没什么问题。

需求2:在需求1基础上,查出关联的h的其它字段(name)

select g.id gid,g.name gname,m.h_id hid,h.name as hname from demo_gs g left join demo_ms  mon m.g_id = g.idleft join demo_hs  hon h.id = m.h_id

结果:

可以看到结果正确。

需求3:在需求2基础上,按gid分组、同时把对应的多个h表的字段各自放在一起

方式1

我们将对应多个的数据使用字符串拼接的方式拼一起,以逗号分隔

pg中可以使用STRING_AGG( CONCAT(h.id, ': ', h.name),'; ')

select g.id gid,g.name gname,group_concat(h.id SEPARATOR ',') hids ,group_concat(h.name SEPARATOR ',') hnamesfrom demo_gs g left join demo_ms  mon m.g_id = g.idleft join demo_hs  hon h.id = m.h_idgroup by gid

结果如下:

方式2

把对应多个的数据的地方使用json构建(适配支持JSON功能的数据库,JSON_OBJECTAGG在pg中不适用):

select g.id gid,g.name gname,JSON_OBJECTAGG(h.id,JSON_OBJECT('hname', h.name)) as hDatafrom demo_gs g inner join demo_ms  mon m.g_id = g.idleft join demo_hs  hon h.id = m.h_idgroup by gid

结果如下:

注意,之所以方式2 inner join demo_ms  m 这里使用了内连,原因是mysql中做JSON处理时要求数据不能为空:[22001]: Data truncation: JSON documents may not contain NULL member names. 

因为这时g表和h表各有一条id=6的数据在m中没有做关联,在做JSON_OBJECTAGG操作时就会报上述错误。因此只能采用内连,屏蔽掉为空的记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578336.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、Cocos Creator 基础入门

目录 Cocos Creator 是什么? 语言支持 功能特性 工作流程 功能模块 相关游戏 参考 Cocos Creator 是什么? Cocos Creator 既是一款高效、轻量、免费开源的跨平台 2D&3D 图形引擎,也是一个实时 2D&3D 数字内容创作平台。拥有…

vue3封装Element导航菜单

1. 导航外层布局 AsideView.vue <template><el-menu:default-active"defaultActive"class"my-menu":collapse"isCollapse":collapse-transition"false"open"handleOpen"close"handleClose"><menu…

aeon,一个好用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - aeon Github地址&#xff1a;https://github.com/aeon-toolkit/aeon 在现代计算机科学和人工智能领域&#xff0c;处理时间序列数据是一个重要而复杂的任务。Python aeon库…

AI计算平台设计方案:901-基于3U VPX的图像数据AI计算平台

一、产品概述 设备基于3U VPX的导冷结构&#xff0c;集成FPGA接口预处理卡&#xff0c;GPU板卡、飞腾ARM处理卡&#xff0c;实现光纤、差分电口或者Camera link的图像接入&#xff0c;FPGA信号预处理&#xff0c;GPU AI计算&#xff0c;飞腾ARM的采集管理存储。 二、系统…

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …

HarmonyOS 应用开发之线程模型

Stage模型下的线程主要有如下三类&#xff1a; 主线程 执行UI绘制。管理主线程的ArkTS引擎实例&#xff0c;使多个UIAbility组件能够运行在其之上。管理其他线程的ArkTS引擎实例&#xff0c;例如使用TaskPool&#xff08;任务池&#xff09;创建任务或取消任务、启动和终止Wor…

harbor api v2.0

harbor api v2.0 v2.0 v2.0 “harbor api v2.0”与原来区别较大&#xff0c;此处harbor也做了https。另外&#xff0c;通过接口拿到的数据也是只能默认1页10个&#xff0c;所以脚本根据实际情况一页页的抓取数据 脚本主要用于统计repo、image&#xff0c;以及所有镜像的tag数&…

学习鸿蒙基础(9)

目录 一、鸿蒙国际化配置 二、鸿蒙常用组件介绍 三、鸿蒙像素单位介绍 四、鸿蒙布局介绍 1、Row与Column线性布局 2、层叠布局-Stack 3、弹性布局 4、栅格布局 5、网格布局 一、鸿蒙国际化配置 base目录下为默认的string。en_US对应美国的。zh_CN对应中国的。新增一个s…

基于单片机模糊算法温度控制系统设计

**单片机设计介绍&#xff0c; 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机模糊算法温度控制系统设计是一个综合性的项目&#xff0c;结合了单片机技术、传感器技术、模糊控制算法等多个方面。以下是对该设计的概要…

kubernetes(K8S)学习(六):K8S之Dashboard图形界面

K8S之Dashboard图形界面 一、Dashboard简介二、k8s安装Dashboard(1)下载Dashboard镜像&#xff08;可选&#xff09;(2)根据yaml文件创建资源(3)查看资源(4)生成登录需要的token(5)使用火狐 / 搜狗浏览器访问&#xff08;个人用的搜狗&#xff09; 一、Dashboard简介 官网&…

Chrome 插件打包发布

插件打包发布 一、打包成 zip 包 最简单方便的一种其实就是打包成 zip 包&#xff0c;通过下载链接进行下载&#xff0c;在包里面通过设置版本号和数据库的版本号对比来提醒用户进行新包的下载。 二、发布到 Chrome 应用商店 1. 注册成为开发者 在发布到 chrome 应用商店之…

Java复习第十三天学习笔记(HTML),附有道云笔记链接

【有道云笔记】十三 3.29 HTML https://note.youdao.com/s/Ru3zoNqM 一、基本标签 HTML:超文本标记语言 定义页面结构 CSS&#xff1a;层叠样式表 页面显示的样式、排版 BootStrap JS: JavaScript 界面交互(动态交互、逻辑) JQuery <!DOCTYPE html> <html> &l…