主表:

从表:

结果集: 查询从表中年龄最大的一行数据,如果存在年龄相等的则为了保证唯一取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);

测试表结构和数据

最新文章

  1. 3.JAVA之GUI编程Frame窗口
  2. Web site collections
  3. JS、ActiveXObject、Scripting.FileSystemObject
  4. nginx做本地目录映射
  5. POJ 2406 Power Strings (KMP)
  6. 详尽介绍FireFox about:config
  7. Linux Rsync
  8. BigDecimal进行除法divide运算注意事项
  9. CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。
  10. NLP︱句子级、词语级以及句子-词语之间相似性(相关名称:文档特征、词特征、词权重)
  11. HBuilder git合作-上传项目到Git Hub
  12. Java数据解析---JSON
  13. CMake系列之四:多个源文件-多个目录
  14. tomcat多项目
  15. pycharm+python+Django之web开发环境的搭建(windows)
  16. [转]LINQ: Using INNER JOIN, Group and SUM
  17. 2017百度春招<有趣的排序>
  18. java如何实现Socket的长连接和短连接
  19. Robot Framework(Screenshot 库)
  20. Software Defined Networking For Dummies, Cisco Special Edition

热门文章

  1. CCF_201403-1_相反数
  2. num06---代理模式
  3. 强烈推荐 10 款珍藏的 Chrome 浏览器插件
  4. Qt使用双缓冲绘图时报错:pure virtual method called
  5. [教程分享]锐族MP3刷固件教程
  6. ubuntu 配置网卡,DNS, iptables
  7. mysql8.0编译安装
  8. 非对称加密 秘钥登录 https
  9. 向C++之父Bjarne Stroustrup致敬
  10. MacBook通过SSH远程访问Parallel中的Ubuntu简明教程