A/B表为1对多关系,要求联合查询B表只提取一条与A记录关联的记录
来源:互联网 发布:拔牙费用知乎 编辑:程序博客网 时间:2024/05/17 04:17
我现在 有主表 A 和从表B
A表字段有: XM nvarchar2(100), RY_ID nvarchar2(32)
B表字段有: RY_ID nvarchar2(32), XL nvarchar2(50), HID NUMBER(7,0)
B的RY_ID为外键关联到A表的RY_ID,所以A/B表形成了一对多的关系。
想查询的结果集包括A表中的记录,同时在B表中提取第一条跟A表记录关联的记录。这个语句该怎么写?
如:
A表 RY_ID XM
1 张三
2 李四
3 王二麻子
……
B表 ID RY_ID XL HID XLLX(学历类型 ,例2用到)
1 1 大学生 1 1
2 1 研究生 2 2
3 1 博士 3 2
4 2 高中 1 1
5 2 中专 2 1
6 3 小学 1 1
……
例1:查询结果要求为:(取每个人HID值最大的XL)
RY_ID XM XL
1 张三 博士
2 李四 中专
3 王二麻子 小学
select a.RY_ID,a.XM,b.XL from A a left join ( SELECT * FROM B W1 WHERE NOT EXISTS( SELECT 1 FROM B W2 WHERE W2.RY_ID=W1.RY_ID AND W1.HID < W2.HID) ) b on a.RY_ID=b.RY_ID;
补充说明:
SELECT * FROM B W1 WHERE NOT EXISTS(
SELECT 1 FROM B W2 WHERE W2.RY_ID=W1.RY_ID AND W1.HID < W2.HID) 这里的not exists ,以及后面的 W1.HID < W2.HID 怎么理解呢?
先不看 exists 先看 B 表的自连接。
W1表 和 W2 表 连接的第一个条件 W2.RY_ID=W1.RY_ID 人员id 的相连 ,图例:
然后再看 第二个条件 W1.HID < W2.HID 这里 就很容易理解了,红色,绿对勾 是 同时满足 W2.RY_ID=W1.RY_ID and W1.HID < W2.HID 的记录 ,
然后就是怎么理解 not EXISTS 这个 结果集了
因为 查询主语句 是 SELECT * FROM B W1 也就是W1 表 W2 表 看做 另一个表 所以说 W1 表 里面 EXISTS hid =1 、2 并且 ry_id=1 的记录 ,反之 not EXISTS 剩下的 也就是 hid=3 并且ry_Id =1的记录 也就是 需求里面 的 每个人的 hid 最大的记录
例2:查询结果要求为:(取每个人HID值最大的XL(学历),同时按XLLX(学历类型)分开统计)
RY_ID XM 全日制学历 在职学历
1 张三 大学生 博士
2 李四 中专 NULL
3 王二麻子 小学 NULL
select a.RY_ID,a.XM,C1.XL as 全日制学历, C2.XL as 在职学历 from A a left join ( SELECT * FROM B W1 WHERE W1.XLLX='1' and NOT EXISTS( SELECT 1 FROM B W2 WHERE W2.XLLX='1' and W2.RY_ID=W1.RY_ID AND W1.HID < W2.HID) ) C1 on a.RY_ID=C1.RY_ID left join ( SELECT * FROM B W1 WHERE W1.XLLX='2' and NOT EXISTS( SELECT 1 FROM B W2 WHERE W2.XLLX='2' and W2.RY_ID=W1.RY_ID AND W1.HID < W2.HID) ) C2 on a.RY_ID=C2.RY_ID;
- A/B表为1对多关系,要求联合查询B表只提取一条与A记录关联的记录
- A/B表替1对多关系,要求联合查询B表只提取一条与A记录关联的记录
- 删除b表中与a表不同的记录
- MYSQL查询A表不在B表中的记录
- 找出A表比B表多的记录
- 查询A表B表同时存在记录, A表存在而B表不存在记录, B表存在而A表不存在记录
- 在A列中找出与B列相同的数据记录并标记为1
- oracle 关联 A表与B表关联,A->B 一对多
- 数据库 a表左连接b表,a中一条数据对应b中多条数据,如何只取b表中createDate最大的一条
- SQL语句 删除表user 中字段name 内容重复的记录,A表 ,B表 字段相同 有关联关系的表 对表两个表中的数据
- 有两张表,结构相同,写一条sql语句,将表A里不同内容的记录复制到表B里
- [面试题] 查询表a在另外一张表b不存在的记录
- A,B两个表中,根据A表单号,查询所有B表中关联原单号的分单记录是否审核完毕,全部审核完毕则显示订单所有信息,否则不显示。
- MySQL----删除B表中A表不存在的记录
- 查询A表在关联B中是否有没有关联到的数据
- [记录]Java 经典的a+b
- sql 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。
- SQL 两表关联 查询出A表中有但是B表中没有的数据
- 慢速乘法和快速幂
- 趣评《java编程思想》
- 哈哈镜滤波
- Android启动Activity的方式原理分析
- 新的生活起点
- A/B表为1对多关系,要求联合查询B表只提取一条与A记录关联的记录
- 数据回滚:基于时间的查询(AS OF TIMESTAMP)和(AS OF ACN)
- SSI指令(一)
- Laravel的核心概念
- Android Studio导入OpenCV Android SDK
- Windows 平台下Myeclipse 10 中SVN 插件使用教程(To
- codeforces 707D Persistent Bookcase 离线+深搜
- 虚拟机下 kali linux 2.0的安装
- ecshop二次开发--节日关怀