高手过招:用SQL解决环环相扣的刑侦推理问题(罗海雄版本)
关注我们获得更多精彩内容!
本文是继 杨长老 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题 之后(点击阅读原文查看历史信息),罗海雄老师提供了一个带注释的版本,希望初学者也能够直接看懂,不仅仅是Oracle的版本,同时MySQL的版本也来了。
试图如图:
思路如下:
1. 构造带 A/B/C/D 四个答案的题目。
2. 把除了第 7 和第 10 题的之外的题目分别用表达式写出来。
3. 由于第 7 第 10 题涉及到所有答案的综合信息,所以外面再套一层,计算 10 道题的每个答案出现的次数(通过 REPLACE 掉特定答案后字符串长度变化来计算特定答案的总个数)作为辅助列,然后再继续判断。
WITH Q AS (/*构造A/B/C/D四个选项 */
SELECT 'A' AS A FROM DUAL
UNION ALL SELECT 'B' FROM DUAL
UNION ALL SELECT 'C' FROM DUAL
UNION ALL SELECT 'D' FROM DUAL)
SELECT * FROM (
SELECT TMP.*
/* 用REPLACE掉特定答案后字符串长度变化来计算特定答案的总个数*/
,10-LENGTH(REPLACE(A_ALL,'A')) A_CNT
,10-LENGTH(REPLACE(A_ALL,'B')) B_CNT
,10-LENGTH(REPLACE(A_ALL,'C')) C_CNT
,10-LENGTH(REPLACE(A_ALL,'D')) D_CNT
FROM ( /* 构造10个题目,其中第10题用Q0指代 */
SELECT Q1.A A1, Q2.A A2, Q3.A A3, Q4.A A4, Q5.A A5,
Q6.A A6, Q7.A A7, Q8.A A8, Q9.A A9, Q0.A A0,
Q1.A||Q2.A||Q3.A||Q4.A||Q5.A||Q6.A
||Q7.A||Q8.A||Q9.A||Q0.A A_ALL
FROM Q Q1,Q Q2,Q Q3,Q Q4,Q Q5,Q Q6,Q Q7,Q Q8,Q Q9,Q Q0
WHERE /* 题目1恒等*/ 1=1
AND (/*题目2*/ Q2.A='A' AND Q5.A='C'
OR Q2.A='B' AND Q5.A='D'
OR Q2.A='C' AND Q5.A='A'
OR Q2.A='D' AND Q5.A='B')
AND (/*题目3*/ Q3.A='A' AND Q3.A NOT IN (Q2.A,Q4.A,Q6.A)
AND Q2.A=Q4.A AND Q2.A=Q6.A
OR Q3.A='B' AND Q6.A NOT IN (Q2.A,Q3.A,Q4.A)
AND Q2.A=Q3.A AND Q2.A=Q4.A
OR Q3.A='C' AND Q2.A NOT IN (Q3.A,Q4.A,Q6.A)
AND Q3.A=Q4.A AND Q3.A=Q6.A
OR Q3.A='D' AND Q4.A NOT IN (Q2.A,Q3.A,Q6.A)
AND Q2.A=Q3.A AND Q2.A=Q6.A)
AND (/*题目4*/ Q4.A='A' AND Q1.A=Q5.A
OR Q4.A='B' AND Q2.A=Q7.A
OR Q4.A='C' AND Q1.A=Q9.A
OR Q4.A='D' AND Q2.A=Q0.A)
AND (/*题目5*/ Q5.A='A' AND Q5.A=Q8.A
OR Q5.A='B' AND Q5.A=Q4.A
OR Q5.A='C' AND Q5.A=Q9.A
OR Q5.A='D' AND Q5.A=Q7.A)
AND (/*题目6*/ Q6.A='A' AND Q8.A=Q2.A AND Q8.A=Q4.A
OR Q6.A='B' AND Q8.A=Q1.A AND Q8.A=Q6.A
OR Q6.A='C' AND Q8.A=Q3.A AND Q8.A=Q0.A
OR Q6.A='D' AND Q8.A=Q5.A AND Q8.A=Q9.A)
AND (/*题目8*/ Q8.A='A' AND ABS(ASCII(Q1.A)-ASCII(Q7.A))!=1
/*不相邻就是ASCII码相差不为1或-1*/
OR Q8.A='B' AND ABS(ASCII(Q1.A)-ASCII(Q5.A))!=1
OR Q8.A='C' AND ABS(ASCII(Q1.A)-ASCII(Q2.A))!=1
OR Q8.A='D' AND ABS(ASCII(Q1.A)-ASCII(Q0.A))!=1)
AND (/*题目9*/ Q9.A='A' AND ((Q1.A=Q6.A AND Q5.A!=Q6.A)
OR (Q1.A!=Q6.A AND Q5.A=Q6.A))
OR Q9.A='B' AND ((Q1.A=Q6.A AND Q5.A!=Q0.A)
OR (Q1.A!=Q6.A AND Q5.A=Q0.A))
OR Q9.A='C' AND ((Q1.A=Q6.A AND Q5.A!=Q2.A)
OR (Q1.A!=Q6.A AND Q5.A=Q2.A))
OR Q9.A='D' AND ((Q1.A=Q6.A AND Q5.A!=Q9.A)
OR (Q1.A!=Q6.A AND Q5.A=Q9.A)))
) TMP)
WHERE (/*题目7*/ A7='A' AND C_CNT < LEAST(A_CNT,B_CNT,D_CNT)
OR A7='B' AND B_CNT < LEAST(A_CNT,C_CNT,D_CNT)
OR A7='C' AND A_CNT < LEAST(B_CNT,C_CNT,D_CNT)
OR A7='D' AND D_CNT < LEAST(A_CNT,B_CNT,C_CNT))
AND (/*题目10*/ A0='A' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 3
OR A0='B' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 2
OR A0='C' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 4
OR A0='D' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 1)
另外,不仅仅是Oracle可以做到,MySQL也可以做到,在上面SQL的基础上稍作改动,就可以在MySQL中也轻松得到答案。
CREATE TABLE Q AS
SELECT ‘A’ union SELECT ‘B’ union SELECT ‘C’ union SELECT ‘D’;
SELECT * FROM (
SELECT TMP.*
/* 用REPLACE掉特定答案后字符串长度变化来计算特定答案的总个数*/
,10-LENGTH(REPLACE(A_ALL,'A','')) A_CNT
,10-LENGTH(REPLACE(A_ALL,'B','')) B_CNT
,10-LENGTH(REPLACE(A_ALL,'C','')) C_CNT
,10-LENGTH(REPLACE(A_ALL,'D','')) D_CNT
FROM ( /* 构造10个题目,其中第10题用Q0指代 */
SELECT Q1.A A1, Q2.A A2, Q3.A A3, Q4.A A4, Q5.A A5,
Q6.A A6, Q7.A A7, Q8.A A8, Q9.A A9, Q0.A A0,
CONCAT(Q1.A,Q2.A,Q3.A,Q4.A,Q5.A,Q6.A
,Q7.A,Q8.A,Q9.A,Q0.A) A_ALL
FROM Q Q1,Q Q2,Q Q3,Q Q4,Q Q5,Q Q6,Q Q7,Q Q8,Q Q9,Q Q0
WHERE /* 题目1恒等*/ 1=1
AND (/*题目2*/ Q2.A='A' AND Q5.A='C'
OR Q2.A='B' AND Q5.A='D'
OR Q2.A='C' AND Q5.A='A'
OR Q2.A='D' AND Q5.A='B')
AND (/*题目3*/ Q3.A='A' AND Q3.A NOT IN (Q2.A,Q4.A,Q6.A)
AND Q2.A=Q4.A AND Q2.A=Q6.A
OR Q3.A='B' AND Q6.A NOT IN (Q2.A,Q3.A,Q4.A)
AND Q2.A=Q3.A AND Q2.A=Q4.A
OR Q3.A='C' AND Q2.A NOT IN (Q3.A,Q4.A,Q6.A)
AND Q3.A=Q4.A AND Q3.A=Q6.A
OR Q3.A='D' AND Q4.A NOT IN (Q2.A,Q3.A,Q6.A)
AND Q2.A=Q3.A AND Q2.A=Q6.A)
AND (/*题目4*/ Q4.A='A' AND Q1.A=Q5.A
OR Q4.A='B' AND Q2.A=Q7.A
OR Q4.A='C' AND Q1.A=Q9.A
OR Q4.A='D' AND Q2.A=Q0.A)
AND (/*题目5*/ Q5.A='A' AND Q5.A=Q8.A
OR Q5.A='B' AND Q5.A=Q4.A
OR Q5.A='C' AND Q5.A=Q9.A
OR Q5.A='D' AND Q5.A=Q7.A)
AND (/*题目6*/ Q6.A='A' AND Q8.A=Q2.A AND Q8.A=Q4.A
OR Q6.A='B' AND Q8.A=Q1.A AND Q8.A=Q6.A
OR Q6.A='C' AND Q8.A=Q3.A AND Q8.A=Q0.A
OR Q6.A='D' AND Q8.A=Q5.A AND Q8.A=Q9.A)
AND (/*题目8*/ Q8.A='A' AND ABS(ASCII(Q1.A)-ASCII(Q7.A))!=1
/*不相邻就是ASC码相差不为1或-1*/
OR Q8.A='B' AND ABS(ASCII(Q1.A)-ASCII(Q5.A))!=1
OR Q8.A='C' AND ABS(ASCII(Q1.A)-ASCII(Q2.A))!=1
OR Q8.A='D' AND ABS(ASCII(Q1.A)-ASCII(Q0.A))!=1)
AND (/*题目9*/ Q9.A='A' AND ((Q1.A=Q6.A AND Q5.A!=Q6.A)
OR (Q1.A!=Q6.A AND Q5.A=Q6.A))
OR Q9.A='B' AND ((Q1.A=Q6.A AND Q5.A!=Q0.A)
OR (Q1.A!=Q6.A AND Q5.A=Q0.A))
OR Q9.A='C' AND ((Q1.A=Q6.A AND Q5.A!=Q2.A)
OR (Q1.A!=Q6.A AND Q5.A=Q2.A))
OR Q9.A='D' AND ((Q1.A=Q6.A AND Q5.A!=Q9.A)
OR (Q1.A!=Q6.A AND Q5.A=Q9.A)))
) TMP)TMP2
WHERE (/*题目7*/ A7='A' AND C_CNT < LEAST(A_CNT,B_CNT,D_CNT)
OR A7='B' AND B_CNT < LEAST(A_CNT,C_CNT,D_CNT)
OR A7='C' AND A_CNT < LEAST(B_CNT,C_CNT,D_CNT)
OR A7='D' AND D_CNT < LEAST(A_CNT,B_CNT,C_CNT))
AND (/*题目10*/ A0='A' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 3
OR A0='B' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 2
OR A0='C' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 4
OR A0='D' AND GREATEST(A_CNT,B_CNT,C_CNT,D_CNT)
- LEAST(A_CNT,B_CNT,C_CNT,D_CNT) = 1)
这一次不仅仅是 Oracle 的版本,MySQL 的也来了,大家品鉴!
资源下载
关注公众号:数据和云(OraNews)回复关键字获取
2018DTCC , 数据库大会PPT
2017DTC,2017 DTC 大会 PPT
DBALIFE ,“DBA 的一天”海报
DBA04 ,DBA 手记4 电子书
122ARCH ,Oracle 12.2体系结构图
2017OOW ,Oracle OpenWorld 资料
PRELECTION ,大讲堂讲师课程资料
近期文章
仅仅使用AWR做报告? 性能优化还未入门
实战课堂:一则CPU 100%的故障分析
杨廷琨:如何编写高效SQL(含PPT)
一份高达555页的技术PPT会是什么样子?
大象起舞:用PostgreSQL解海盗分金问题
高手过招:用SQL解决环环相扣的刑侦推理问题(罗海雄版本)相关推荐
- 高手过招:用SQL解决环环相扣的刑侦推理问题(苏旭辉版本)
苏旭晖,网名 newkid,ITPUB 开发版资深版主,SQL开发专家 本文是继 杨长老 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题 之后,苏旭辉的一个版本,希望大家能够在高手的过招中,看到喜 ...
- 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题
关注我们获得更多精彩内容! 高考期间看到一个朋友在朋友圈里面贴了个图,上面是2018年刑侦科推理试题,看了一下题目,这些题目都是彼此依赖,很难找到一个题目作为入手点可以进一步分析,因此可能需要用纸笔配 ...
- 如何在不改SQL的情况下优化数据库- 云和恩墨优化专家罗海雄
罗海雄 云和恩墨优化专家 ITPUB论坛数据库管理版版主,2012 ITPUB全国SQL大赛冠军得主,他还是资深的架构师和性能优化专家,对 SQL 优化和理解尤其深入:作为业内知名的技术传播者之一,经 ...
- 【云和恩墨大讲堂】罗海雄 | 如何在不改SQL的情况下优化数据库
"云和恩墨大讲堂" 线上课程周四晚继续开讲.本期我们邀请的嘉宾是云和恩墨北区技术专家 - 罗海雄,跟大家分享如何在不改SQL的情况下优化数据库.课程以图文形式在微信课堂群全程同步直 ...
- 软件开发顶尖高手的杀手锏SQL语句
软件开发顶尖高手的杀手锏SQL语句 ...
- 特仑苏VS金典,解读高手过招
特仑苏VS金典,解读高手过招 2005年蒙牛乳业推出了旗下高端品牌"特仑苏",就此拉开了国内液态奶产品升级的帷幕.作为蒙牛的老对手,伊利自然不甘示弱,随后以"金典&quo ...
- SQL反模式笔记17——用一条sql解决复杂问题
目标:检查sql查询次数 反模式:试图用一条sql解决复杂问题 结果是:性能很低,而且往往得到了一个笛卡尔积. 解决方案:分而治之 用多个sql得到数据,再进行整合.或者union多个sql的结果. ...
- P2575 高手过招
P2575 高手过招 题意: AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你 ...
- 创建存储过程时出现的This function has none of DETERMINISTIC, NO SQL解决办法
This function has none of DETERMINISTIC, NO SQL解决办法 创建存储过程时 出错信息: ERROR 1418 (HY000): This function ...
最新文章
- js 控制选中文字
- 基于MATLAB的IIR滤波器设计与实现
- 【转自lzplzp】pair project总结
- firefox input file宽度失效
- 星益云聚合收银台v1.45开源完整版【最终版本】
- SQL实战之查找最晚入职员工的所有信息
- wpf程序启动时停止工作,事件管理器报错kernelbase.dll
- 耶鲁华裔硕士被击数枪身亡,嫌犯疑竟是MIT博士生,曾获奥数银牌
- R、Rstudio的下载和安装教程
- vue实现上传图片识别文字
- 魔兽世界8.0哪个服务器稳定,魔兽世界活得最安逸的BOSS!8.0版本才拿到7.0服务器首杀!...
- 2021广东高考成绩排名如何查询,2021广东省地区高考成绩排名查询,广东省高考各高中成绩喜报榜单...
- 基于HyperLPR的车牌识别
- 大厂经典数据库(MongoDB)面试题整理汇总
- 找高清视频素材,就上这6个网站。
- meanshift原理与代码详解
- 晶体三极管结构及其工作原理详解
- mybatis 的 insert
- Springboot中常见疑难杂症记录
- Nacos系列【23】Nacos2.x服务发现模块之注册中心健康检查机制
热门文章
- 开源供应链金融_成为开源供应链
- 实战 | Vue + Element UI 页面创建
- 简易 MVC框架 弃坑
- 三.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---1.项目文件介绍(除主要源码部分)
- db2设置数据库增量备份_DB2在线增量备份 还原增量备份及前滚恢复
- iis服务器文件上传大小限制,windows服务器中iis限制文件大小方法
- 鸿蒙系统 闹钟,华为鸿蒙2.0操作系统正式版
- 二:前端css,即选择器
- (22)进程和线程区别
- Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用