高手过招:用SQL解决环环相扣的刑侦推理问题(罗海雄版本)

简介:

试图如图:

07ba5e7bfe69a1f955f96228ff1534d4c496d18c

思路如下:

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 的也来了,大家品鉴!


原文发布时间为:2018-06-14

本文作者:罗海雄

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”。

相关文章
|
3月前
|
SQL 流计算
Flink CDC 1.12版本引入了对SQL Server的支持
【1月更文挑战第26天】【1月更文挑战第124篇】Flink CDC 1.12版本引入了对SQL Server的支持
33 1
|
3月前
|
SQL 安全 大数据
SQL Server主流版本生命周期管理
SQL Server主流版本提供至少10年的支持周期,包括5年主要支持期(含功能更新、性能改进等)和5年扩展支持期(仅限安全更新),直至终止支持为止。
53 0
|
3月前
|
SQL Shell 数据库
无人参与安装最新版本SQL Server Management Studio (SSMS)
通过power shell完成SSMS的自动安装,给大家争取打水的时间,离开位置走走,活动活动筋骨。
34 0
|
4月前
|
SQL JSON 关系型数据库
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
50 0
|
11月前
|
SQL 存储 大数据
SQL Server 跨版本数据迁移实践
SQL Server 的导入和导出向导是一个非常有用的工具,可以帮助用户快速导入和导出数据,而无需编写复杂的 SQL 查询或程序代码。使用导入和导出向导,用户可以选择数据源、目标数据、映射源和目标列、指定导入或导出选项以及完成导入或导出操作,整个使用体验也非常简单便捷。
233 0
|
10月前
|
SQL Oracle NoSQL
Flink CDC 2.4 正式发布,新增 Vitess 数据源,PostgreSQL 和 SQL Server CDC 连接器支持增量快照,升级 Debezium 版本
Flink CDC 2.4 正式发布,新增 Vitess 数据源,PostgreSQL 和 SQL Server CDC 连接器支持增量快照,升级 Debezium 版本
1050 1
Flink CDC 2.4 正式发布,新增 Vitess 数据源,PostgreSQL 和 SQL Server CDC 连接器支持增量快照,升级 Debezium 版本
|
11月前
|
SQL 安全 关系型数据库
SQL注入 安全狗apache3.5.12048版本绕过(下)
SQL注入 安全狗apache3.5.12048版本绕过
130 0
|
11月前
|
SQL 安全 关系型数据库
SQL注入 安全狗apache3.5.12048版本绕过(上)
SQL注入 安全狗apache3.5.12048版本绕过
93 0
|
SQL 关系型数据库 Linux
知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
之前一直使用的PostgreSQL 9.6系列版本,由于官方不再维护了,就准备换成最新稳定版本的,查看了一下官方版本说明,发现13系列版本是目前稳定性较好的版本,于是兴冲冲的更换了过来,但随之而来的就是一些新特性,其中就比如表中的OID字段,这个字段是对象标识符,之前能用于行标记,现在发现只有表才具有这个隐藏字段,行数据没有这个支持了,于是就需要将老版本的表进行关闭掉这个字段。下面我们就开始关闭之旅。
131 0
知识分享之PostgreSQL——OIDS的特性与新版本去除SQL
|
SQL 关系型数据库 MySQL
SQL追踪器phpgjx2.0版本配置(二)
SQL追踪器phpgjx2.0版本配置(二)
117 0
SQL追踪器phpgjx2.0版本配置(二)