主表:

从表:

结果集: 查询从表中年龄最大的一行数据,如果存在年龄相等的则为了保证唯一取id(主键)最大的一行。

一、利用sql子查询嵌套
-- --------------------------------
-- 利用sql子查询嵌套
-- --------------------------------
-- step 1. 子查询:找到每组最大的子类年龄
select parent_id,max(child_age) from child group by parent_id; -- step 2. 找到符合的行 (很可能出现重复)
select cc.* from child cc
INNER JOIN (select parent_id,max(child_age) child_age from child group by parent_id) tmp
on tmp.parent_id = cc.parent_id and tmp.child_age = cc.child_age
order by cc.parent_id,cc.child_id; -- step 3. 为了解决重复需要再加一层,取唯一标识id最大/最小的一行
select max(cc.child_id) from child cc
INNER JOIN (select parent_id,max(child_age) child_age from child group by parent_id) tmp
on tmp.parent_id = cc.parent_id and tmp.child_age = cc.child_age
group by cc.parent_id,cc.child_age -- step 4. 在3中就找到了符合条件行的id
select * from parent pa
LEFT JOIN (SELECT cc.* from child cc
INNER JOIN (select max(cc.child_id) child_id from child cc
INNER JOIN (select parent_id,max(child_age) child_age from child group by parent_id) tmp
  on tmp.parent_id = cc.parent_id and tmp.child_age = cc.child_age
group by cc.parent_id,cc.child_age) tmp on TMP.child_id = cc.child_id
) tmp on tmp.parent_id = pa.parent_id
where 1=1 ORDER BY pa.parent_id;
二、利用oracle自带的分析函数
-- --------------------------------
-- 利用oracle分析函数
-- --------------------------------
-- step-1:找到子类符合的id, DISTINCT去重
select DISTINCT first_value(cc.child_id)
over(partition by cc.parent_id order by cc.parent_id,cc.child_age desc,cc.child_id desc) child_id
from child cc;
-- step-2: 符合的子类结果集
SELECT * from child cc where cc.child_id in(
select DISTINCT first_value(cc.child_id)
over(partition by cc.parent_id order by cc.parent_id,cc.child_age desc,cc.child_id desc) child_id
from child cc
); SELECT * from child cc where EXISTS ( select 1 from (
select DISTINCT first_value(cc.child_id)
over(partition by cc.parent_id order by cc.parent_id,cc.child_age desc,cc.child_id desc) child_id
from child cc) tmp where tmp.child_id = cc.child_id
); -- step-3: 最终结果集
select * from parent pa
LEFT JOIN child cc on cc.parent_id = pa.parent_id
and cc.child_id in(
select DISTINCT first_value(cc.child_id)over(partition by cc.parent_id order by cc.parent_id,cc.child_age desc,cc.child_id desc)
from child cc)
where 1=1 ORDER BY pa.parent_id
三、分析区别

sql嵌套当然要更通用点,而且看执行计划,它的效率、消耗都要比oracle少很多;

oracle分析函数感觉还是子查询嵌套了一层,而且效率、消耗都比较高。

(才知道oracle的执行计划,完全不懂。只是看着sql嵌套查询的执行计划高效很多)

四、测试数据
-- -----------------------------
-- PARENT 父表
-- -----------------------------
CREATE TABLE "PARENT" (
"PARENT_ID" NUMBER NOT NULL ,
"PARENT_NAME" VARCHAR2(255 BYTE) NOT NULL
)
LOGGING NOCOMPRESS NOCACHE;
-- Records of PARENT
INSERT INTO "PARENT" VALUES ('', '周父');
INSERT INTO "PARENT" VALUES ('', '吴父');
INSERT INTO "PARENT" VALUES ('', '郑父');
INSERT INTO "PARENT" VALUES ('', '王父');
INSERT INTO "PARENT" VALUES ('', '赵父');
-- Checks structure for table PARENT
ALTER TABLE "PARENT" ADD CHECK ("PARENT_ID" IS NOT NULL);
ALTER TABLE "PARENT" ADD CHECK ("PARENT_NAME" IS NOT NULL); -- -----------------------------
-- PARENT 子表
-- -----------------------------
CREATE TABLE "CHILD" (
"CHILD_ID" NUMBER NOT NULL ,
"CHILD_NAME" VARCHAR2(255 BYTE) NOT NULL ,
"CHILD_AGE" NUMBER NOT NULL ,
"PARENT_ID" VARCHAR2(255 BYTE) NOT NULL
)
LOGGING NOCOMPRESS NOCACHE; -- ----------------------------
-- Records of CHILD
-- ----------------------------
INSERT INTO "CHILD" VALUES ('', '周一', '', '');
INSERT INTO "CHILD" VALUES ('', '周二', '', '');
INSERT INTO "CHILD" VALUES ('', '周三', '', ''); INSERT INTO "CHILD" VALUES ('', '吴一', '', '');
INSERT INTO "CHILD" VALUES ('', '吴二', '', '');
INSERT INTO "CHILD" VALUES ('', '吴三', '', '');
INSERT INTO "CHILD" VALUES ('', '吴四', '', ''); INSERT INTO "CHILD" VALUES ('', '郑一', '', '');
INSERT INTO "CHILD" VALUES ('', '郑二', '', ''); INSERT INTO "CHILD" VALUES ('', '王一', '', ''); -- Checks structure for table CHILD
ALTER TABLE "CHILD" ADD CHECK ("CHILD_ID" IS NOT NULL);
ALTER TABLE "CHILD" ADD CHECK ("CHILD_NAME" IS NOT NULL);
ALTER TABLE "CHILD" ADD CHECK ("CHILD_AGE" IS NOT NULL);
ALTER TABLE "CHILD" ADD CHECK ("PARENT_ID" IS NOT NULL);

测试表结构和数据

【database】oracle关联查询主表对应的特定一行从表结果集的更多相关文章

  1. Oracle关联查询-数据类型不一致问题 ORA-01722: 无效数字

    一.存在表A和表B,都包含字段user_no,但数据类型不一致,如下: create table A ( user_id varchar2(20), user_no number(12,0), xxx ...

  2. Oracle关联查询关于left/right join的那点事

    /*题外话 --更改foreign key约束定义引用行(delete cascade/delete set null/delete no action),默认delete on action--引用 ...

  3. Oracle 关联查询

    select count(1),a.policy_id from gp_pol_prod a where a.product_id=8401 group by a.policy_id having c ...

  4. oracle中查询、禁用、启用、删除表外键

    1.查询所有表的外键的: select table_name, constraint_name from user_constraints where constraint_type = 'R';   ...

  5. SQL语句关联查询

    一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...

  6. mybatis collection 一对多关联查询,单边分页的问题总结!

    若想直接通过sql实现多级关联查询表结构得有2 个必不可少的字段:id ,parentId,levelId id:主键id, parentId:父id levelId:表示第几级(表本身关联查询的时候 ...

  7. mysql如何执行关联查询与优化

    mysql如何执行关联查询与优化 一.前言 在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么m ...

  8. mybatis实战教程二:多对一关联查询(一对多)

    多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...

  9. 【SQL】在SQL Server中多表关联查询问题

    好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...

随机推荐

  1. requests的post提交form-data; boundary=????

    提交这种用boundary分隔的表单数据时,有两种方法,一种是以传入files参数,另一种是传入data参数,data参数需要自己用boundary来分隔为指定的形式,而files参数则以元组的形式传 ...

  2. 为什么尽量不要使用Executors创建线程池

    看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,通过源码分析禁用的原因. 线程池的优点 管理一组工作线程,通过线程池 ...

  3. 数据库主从监控脚本,数据传到influxdb

    #!/bin/bash port=`/usr/sbin/ss -ntlp | | awk '{print $4}' | awk -F":" '{print $2}'` array= ...

  4. Spring源码阅读笔记02:IOC基本概念

    上篇文章中我们介绍了准备Spring源码阅读环境的两种姿势,接下来,我们就要开始探寻这个著名框架背后的原理.Spring提供的最基本最底层的功能是bean容器,这其实是对IoC思想的应用,在学习Spr ...

  5. backgroud图片充满元素的方法

    background-image: url("img/headimg.png"); height: 219px; background-size: 100% 100%; backg ...

  6. electron 安装过程出现未成功地运行

    问题 正文 产生问题得原因? 是因为之前安装了该程序,但是卸载的时候可能人为的直接删除了卸载程序. 这时候安装包会触发找到注册表中,该appid相同地址的卸载程序位置,然后进行调用,如果没有的话,只会 ...

  7. [Wpf学习] 1.传说中的Main

    原来的C#程序都有Main的,现在用vs新建一个Wpf项目,启动似乎变成App.xmal,前期项目中为了获取启动参数,很是折腾了一番: 1.先是修改App.xaml,添加StartUp事件 <A ...

  8. 使用jdbc将mysql数据库中的内容封装为指定对象的list集合

    使用jdbc将mysql数据库中的内容封装为指定对象的list集合 public List<User> findAll() { private JdbcTemplate template ...

  9. PMP--2.2 效益管理计划

    一.文件背景概述 ​​​1. 所需文件/数据 制定效益管理计划需要使用商业论证和需求评估中的数据和信息,例如,成本效益分析数据. 成本效益分析数据是在商业论证和需求评估中得到的,在成本效益分析中已经把 ...

  10. 小白的linux学习笔记10:安装nginx和第一个网页

    sudo yum install nginx sudo systemctl status nginx sudo systemctl start nginx 检查端口:netstat -tlpn sud ...