http://oraqa.com/2008/02/01/how-to-solve-the-coin-combinations-puzzle-in-sql/
高人的
http://oraqa.com/author/frank-zhou/
发现一位专门用SQL解各种谜题的高人!
名字叫Frank Zhou, 似乎是中国人:
http://oraqa.com/author/frank-zhou/
最近OO发的几个趣味问题,他早就做过了。他写的SQL很对我的胃口,我准备陆续把一些有趣的问题转贴过来,比如这个:
http://oraqa.com/2008/02/01/how- ... ions-puzzle-in-sql/
Assuming you have enough coins of 1, 5, 10, 25 and 50 cents, how many ways are there to make change for a dollar?
用1分,5分,10分,25分,50分硬币凑成一元,总共有几种组合办法?
我用11GR2的写法:
WITH coins AS (
SELECT 1 cents FROM DUAL
UNION ALL SELECT 5 cents FROM DUAL
UNION ALL SELECT 10 cents FROM DUAL
UNION ALL SELECT 25 cents FROM DUAL
UNION ALL SELECT 50 cents FROM DUAL
)
,t(c1,c5,c10,c25,c50,cents,total_val) AS (
SELECT DECODE(c.cents,1,1,0)
,DECODE(c.cents,5,1,0)
,DECODE(c.cents,10,1,0)
,DECODE(c.cents,25,1,0)
,DECODE(c.cents,50,1,0)
,cents
,cents
FROM coins c
UNION ALL
SELECT c1 + DECODE(c.cents,1,1,0)
,c5 + DECODE(c.cents,5,1,0)
,c10+ DECODE(c.cents,10,1,0)
,c25+ DECODE(c.cents,25,1,0)
,c50+ DECODE(c.cents,50,1,0)
,c.cents
,t.total_val + c.cents
FROM t, coins c
WHERE t.total_val + c.cents<=100 AND t.cents<=c.cents
)
SELECT * FROM t WHERE total_val=100;
他的写法在11G通不过:
SELECT ltrim(max(str),',') combinations,
rtrim(ltrim(replace(max(str_num),',','+'),'+'),'+') Sum,
count(*) over () as counter
FROM
(SELECT sys_connect_by_path(str,', ') str, rownum rn,
translate(sys_connect_by_path(str_num,','),
chr(0)||'ABCDE',chr(0))||',' AS str_num
FROM
(SELECT str_num, str, to_number(substr(str_num,0,length(str_num)-1)) n,
substr(str_num,length(str_num)) coin_type
FROM
(SELECT LEVEL||'A' str_num , LEVEL||' Penny' AS str
FROM dual CONNECT BY LEVEL <=100
UNION ALL
SELECT LEVEL*5||'B' str_num, LEVEL||' Nickel'
FROM dual CONNECT BY LEVEL*5 <=100
UNION ALL
SELECT LEVEL*10||'C' str_num, LEVEL||' Dime'
FROM dual CONNECT BY LEVEL*10 <=100
UNION ALL
SELECT LEVEL*25||'D' str_num, LEVEL||' Quarter'
FROM dual CONNECT BY LEVEL*25 <=100
UNION ALL
SELECT LEVEL*50||'E' str_num, LEVEL||' Half D$'
FROM dual CONNECT BY LEVEL*50<=100
)
)
WHERE
CASE LEVEL
WHEN 1 THEN CASE WHEN n = 100 THEN 1 END
WHEN 2 THEN CASE WHEN n + PRIOR n =100 THEN 1 END
WHEN 3 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n =100 THEN 1 END
ELSE 1 END =1
CONNECT BY PRIOR coin_type < coin_type
AND
CASE LEVEL
WHEN 2 THEN CASE WHEN n + PRIOR n <=100 THEN 1 END
WHEN 3 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <=100 THEN 1 END
WHEN 4 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <96 THEN 1 END
WHEN 5 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <=85 THEN 1 END
ELSE 1 END =1
)
CONNECT BY PRIOR rn = rn
AND INSTR(str_num,',', 1,LEVEL+1) > 0
AND PRIOR dbms_random.string('p',10) IS NOT NULL
GROUP BY rn
HAVING SUM(TO_NUMBER(SUBSTR(str_num,
INSTR(str_num,',', 1, LEVEL) + 1,
INSTR(str_num,',', 1, LEVEL+1) -
INSTR(str_num,',', 1, LEVEL) -1))) = 100 ;
WHEN 3 THEN CASE WHEN CONNECT_BY_ROOT n + PRIOR n + n <=100 THEN 1 END
*
ERROR at line 38:
ORA-30007: CONNECT BY ROOT operator is not supported in the START WITH or in the CONNECT BY condition
印象中只有某个版本允许在CONNECT BY条件中使用CONNECT_BY_ROOT。
发现一位专门用SQL解各种谜题的高人!
分享到:
相关推荐
SQL server的上机试验,应该会有用到的,希望会有人用到!!!!!!!!!!!!!!
sql练习题学习!!!
该部分提到了Joe Celko的著作,Joe Celko是一位著名的SQL编程专家,他的多部书籍被广泛用作提高数据库设计和SQL编程技能的教材。 通过探讨和解决各种谜题,可以学习到以下几个方面的知识: 1. SQL编程规范性:编写...
这一集成不仅统一了界面,还集成了原本分散的各种工具,如SQL Query Analyzer、分析管理器、报表管理器等。这种集成使得数据库管理员和开发者只需要熟悉一个界面,就能处理所有相关的管理与开发任务。同时,它引入了...
标题中的“SQL解挂工具”指的是专门用于解决SQL Server安装过程中遇到的问题的工具,特别是针对“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”这类错误。这类错误...
本人在Windows7 64位+SQL Server 2012环境下测试通过(系统是全新安装) 使用方法: 1,安装SQLPrompt v5.3,这个不多说。 2,安装完毕后,断开网络连接。 3,打开Visual Studio或者SQL Server Management Studio(版本...
标题中的“2008sql客户端32位”指的是Microsoft SQL Server 2008的32位版本的客户端工具。SQL Server 2008是微软推出的一款关系型数据库管理系统,它提供了全面的数据存储、管理和分析解决方案。32位版本意味着这个...
SQL Pretty Printer可以让每个人员开发时使用自己喜欢的格式,但递交代码时,统一用公司制定的SQL规范。 在编程语言中访问数据库时需要嵌入SQL,同时又经常从编程语言中提取SQL,然后到数据库工具中进行调试。SQL ...
至少会把SQL的格式排列成易于阅读的,因为其他人会阅读到你的SQL,无论是在程序中或是脚本文件中,良好的排版不仅让人看起来赏心悦目,在和他人之间做交流时也省时省力,不会因为揉成一团的sql去询问Team Member:您...
多线程+中文破解SQL自动注入猜解机.......
很好的SQL 导出execl文件! 使用SQL语句! 能完全的导出数据!很实用哦!
在64位系统上安装和使用SQL Server 2008是现代数据库管理的一个重要环节。SQL Server 2008作为微软推出的一款强大的关系型数据库管理系统,它提供了丰富的功能和性能优化,尤其在64位环境下,可以充分利用硬件资源,...
SQL语法范例大全SQL和Oracle通解
Sql Server 2014 Express LocalDB 32位离线安装版是一个专为开发者设计的轻量级数据库管理系统,适用于32位Windows操作系统,尤其是Win7及更高版本。此安装包是离线版本,意味着它不依赖互联网连接,可以在没有网络...
SQL Server 2008是微软公司开发的一款关系型数据库管理系统(RDBMS),专为各种规模的企业设计,提供了一套全面的数据管理和分析解决方案。它支持多种操作系统,并且在这个案例中,我们关注的是32位版本,适用于那些...
通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录...
SQLTracker是一款专为监视在Oracle数据库上运行的应用程序而设计的高效工具,尤其适用于64位Windows操作系统,如Win7和Win10。这款工具旨在帮助数据库管理员(DBA)和开发人员深入理解SQL查询的执行性能,从而优化...
使用方法:断网,用Keygen算出序列号,启动SQL管理器,SQL Prompt会一起启动,然后在菜单中点击激活,把序列号输入,由于没有联网,选择手动激活,把软件生成的文字粘帖到keygen的第二栏,把第三栏自动生成的内容粘贴...
SQLTracker是一款专为Oracle数据库设计的高性能监控工具,尤其针对64位操作系统,如win7和win10,提供强大的跟踪和分析功能。在数据库管理领域,了解并掌握SQLTracker对于提升数据库性能优化和问题排查至关重要。 ...
SQL Server 是一种关系型数据库管理系统,广泛应用于各种行业。然而,在实际应用中,我们经常会遇到导入超大 SQL 脚本文件的问题。本文将介绍如何使用 osql 工具来导入超大 SQL 脚本文件。 什么是 osql? osql 是 ...