关注我们获得更多精彩内容!

本文是继 杨长老 刑侦高考:如何用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解决环环相扣的刑侦推理问题(罗海雄版本)相关推荐

  1. 高手过招:用SQL解决环环相扣的刑侦推理问题(苏旭辉版本)

    苏旭晖,网名 newkid,ITPUB 开发版资深版主,SQL开发专家 本文是继 杨长老 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题  之后,苏旭辉的一个版本,希望大家能够在高手的过招中,看到喜 ...

  2. 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题

    关注我们获得更多精彩内容! 高考期间看到一个朋友在朋友圈里面贴了个图,上面是2018年刑侦科推理试题,看了一下题目,这些题目都是彼此依赖,很难找到一个题目作为入手点可以进一步分析,因此可能需要用纸笔配 ...

  3. 如何在不改SQL的情况下优化数据库- 云和恩墨优化专家罗海雄

    罗海雄 云和恩墨优化专家 ITPUB论坛数据库管理版版主,2012 ITPUB全国SQL大赛冠军得主,他还是资深的架构师和性能优化专家,对 SQL 优化和理解尤其深入:作为业内知名的技术传播者之一,经 ...

  4. 【云和恩墨大讲堂】罗海雄 | 如何在不改SQL的情况下优化数据库

    "云和恩墨大讲堂" 线上课程周四晚继续开讲.本期我们邀请的嘉宾是云和恩墨北区技术专家 - 罗海雄,跟大家分享如何在不改SQL的情况下优化数据库.课程以图文形式在微信课堂群全程同步直 ...

  5. 软件开发顶尖高手的杀手锏SQL语句

                  软件开发顶尖高手的杀手锏SQL语句                                                                      ...

  6. 特仑苏VS金典,解读高手过招

    特仑苏VS金典,解读高手过招 2005年蒙牛乳业推出了旗下高端品牌"特仑苏",就此拉开了国内液态奶产品升级的帷幕.作为蒙牛的老对手,伊利自然不甘示弱,随后以"金典&quo ...

  7. SQL反模式笔记17——用一条sql解决复杂问题

    目标:检查sql查询次数 反模式:试图用一条sql解决复杂问题 结果是:性能很低,而且往往得到了一个笛卡尔积. 解决方案:分而治之 用多个sql得到数据,再进行整合.或者union多个sql的结果. ...

  8. P2575 高手过招

    P2575 高手过招 题意: AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你 ...

  9. 创建存储过程时出现的This function has none of DETERMINISTIC, NO SQL解决办法

    This function has none of DETERMINISTIC, NO SQL解决办法 创建存储过程时 出错信息: ERROR 1418 (HY000): This function ...

最新文章

  1. js 控制选中文字
  2. 基于MATLAB的IIR滤波器设计与实现
  3. 【转自lzplzp】pair project总结
  4. firefox input file宽度失效
  5. 星益云聚合收银台v1.45开源完整版【最终版本】
  6. SQL实战之查找最晚入职员工的所有信息
  7. wpf程序启动时停止工作,事件管理器报错kernelbase.dll
  8. 耶鲁华裔硕士被击数枪身亡,嫌犯疑竟是MIT博士生,曾获奥数银牌
  9. R、Rstudio的下载和安装教程
  10. vue实现上传图片识别文字
  11. 魔兽世界8.0哪个服务器稳定,魔兽世界活得最安逸的BOSS!8.0版本才拿到7.0服务器首杀!...
  12. 2021广东高考成绩排名如何查询,2021广东省地区高考成绩排名查询,广东省高考各高中成绩喜报榜单...
  13. 基于HyperLPR的车牌识别
  14. 大厂经典数据库(MongoDB)面试题整理汇总
  15. 找高清视频素材,就上这6个网站。
  16. meanshift原理与代码详解
  17. 晶体三极管结构及其工作原理详解
  18. mybatis 的 insert
  19. Springboot中常见疑难杂症记录
  20. Nacos系列【23】Nacos2.x服务发现模块之注册中心健康检查机制

热门文章

  1. 开源供应链金融_成为开源供应链
  2. 实战 | Vue + Element UI 页面创建
  3. 简易 MVC框架 弃坑
  4. 三.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---1.项目文件介绍(除主要源码部分)
  5. db2设置数据库增量备份_DB2在线增量备份 还原增量备份及前滚恢复
  6. iis服务器文件上传大小限制,windows服务器中iis限制文件大小方法
  7. 鸿蒙系统 闹钟,华为鸿蒙2.0操作系统正式版
  8. 二:前端css,即选择器
  9. (22)进程和线程区别
  10. Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用