鸡兔同笼
一、问题简述
笼子里有鸡和兔两种动物,这些小动物,有150条腿,60个头,问:有几只鸡?几只兔?
全是鸡:120条腿;
全是兔:240条腿;
就简单的按实际腿数,不考虑任何抬脚、躺着的之类的情况
二、思路
这题思路是穷举法,所以先用Excel进行分析,因为有60个头,可先列出鸡的数列60,然后兔的头就是60-鸡头数,然后腿数按正常条件和为 鸡头数 乘以 2 加上 剩下的兔头数 乘以 4,结果集就直接通过【 鸡头数 乘以 2 加上 剩下的兔头数 乘以 4】 等于题目给的 150 条腿进行条件判断,为TRUE 则是鸡兔个数;【这里涉及Excel的基本表操作】
对于基本的数学思路有了,这时候要转化为SQL语句;
三、前置知识
1、 with 语句:
Oracle 数据库中,使用 with 语句可以实现子查询,提高语句执行的效率;
当查询中多次用到某一部分时,可以用 Oracle with 语句创建一个公共临时表。因为子查询在内存临时表中,避免了重复解析,所以执行效率会提高不少。临时表在一次查询结束自动清除。
2、connect by:
用到Oracle 的 connect by的一个特殊用法,用来产生指定行的一个虚拟表。
四、使用工具
Oracle
PL/ SQL Developer
五、SQL代码——基于Oracle
with t as
(
select
rownum as ji,
60 - rownum as tu,
rownum * 2 + ( 60 - rownum) * 4 as allLeg
from dual connect by rownum <= 60
)
select
t.ji ,
t.tu ,
t.allLeg
from t
where
t.allLeg = 150
;
六、附上结果截图
没有加上 where 限制条件之前,和 Excel 思路分析 一样
七、小结
接触这个题目是即将接触ETL的兴趣题,还蛮有意思的,鸡兔同笼问题条件可以自己约束一些条件,头多少个,然后根据头数随便定一个鸡和兔总腿数,只要腿总数符合他们最大的腿数和即可;
对于这题的思路和解决问题的SQL肯定有不一样的,只是一些小想法,而且代码也不一定写的规范易懂,如果有道友看到这篇文章有其他的思路也可以一起讨论哦;