`
huangningren
  • 浏览: 44511 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

发现一位专门用SQL解各种谜题的高人!

阅读更多

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 试验!!SQLserver 试验!!!

    SQL server的上机试验,应该会有用到的,希望会有人用到!!!!!!!!!!!!!!

    sql练习题学习!!!

    sql练习题学习!!!

    SQL谜题和答案

    该部分提到了Joe Celko的著作,Joe Celko是一位著名的SQL编程专家,他的多部书籍被广泛用作提高数据库设计和SQL编程技能的教材。 通过探讨和解决各种谜题,可以学习到以下几个方面的知识: 1. SQL编程规范性:编写...

    SQL!!!!!!!!!!!!!!!!!!!!!!!!!

    这一集成不仅统一了界面,还集成了原本分散的各种工具,如SQL Query Analyzer、分析管理器、报表管理器等。这种集成使得数据库管理员和开发者只需要熟悉一个界面,就能处理所有相关的管理与开发任务。同时,它引入了...

    SQL解挂工具

    标题中的“SQL解挂工具”指的是专门用于解决SQL Server安装过程中遇到的问题的工具,特别是针对“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”这类错误。这类错误...

    SQLPrompt5.3破解

    本人在Windows7 64位+SQL Server 2012环境下测试通过(系统是全新安装) 使用方法: 1,安装SQLPrompt v5.3,这个不多说。 2,安装完毕后,断开网络连接。 3,打开Visual Studio或者SQL Server Management Studio(版本...

    2008sql客户端32位

    标题中的“2008sql客户端32位”指的是Microsoft SQL Server 2008的32位版本的客户端工具。SQL Server 2008是微软推出的一款关系型数据库管理系统,它提供了全面的数据存储、管理和分析解决方案。32位版本意味着这个...

    SQL格式化工具2.8.7汉化+破解

    SQL Pretty Printer可以让每个人员开发时使用自己喜欢的格式,但递交代码时,统一用公司制定的SQL规范。 在编程语言中访问数据库时需要嵌入SQL,同时又经常从编程语言中提取SQL,然后到数据库工具中进行调试。SQL ...

    SQLServer_2000-2008_R2查询智能分析器RedGate_SQL_Prompt_V5.3.4.1_Crack_Keygen破解教程注册机免费

    至少会把SQL的格式排列成易于阅读的,因为其他人会阅读到你的SQL,无论是在程序中或是脚本文件中,良好的排版不仅让人看起来赏心悦目,在和他人之间做交流时也省时省力,不会因为揉成一团的sql去询问Team Member:您...

    多线程+中文破解SQL自动注入猜解机

    多线程+中文破解SQL自动注入猜解机.......

    SQL_execl 文件导出,使用SQL语句!

    很好的SQL 导出execl文件! 使用SQL语句! 能完全的导出数据!很实用哦!

    64位系统SQL SERVER 2008

    在64位系统上安装和使用SQL Server 2008是现代数据库管理的一个重要环节。SQL Server 2008作为微软推出的一款强大的关系型数据库管理系统,它提供了丰富的功能和性能优化,尤其在64位环境下,可以充分利用硬件资源,...

    SQL语法范例大全SQL和Oracle通解

    SQL语法范例大全SQL和Oracle通解

    SqlServer2014ExpressLocalDB32位离线安装版

    Sql Server 2014 Express LocalDB 32位离线安装版是一个专为开发者设计的轻量级数据库管理系统,适用于32位Windows操作系统,尤其是Win7及更高版本。此安装包是离线版本,意味着它不依赖互联网连接,可以在没有网络...

    sqlserver 2008简体中文版32位.zip

    SQL Server 2008是微软公司开发的一款关系型数据库管理系统(RDBMS),专为各种规模的企业设计,提供了一套全面的数据管理和分析解决方案。它支持多种操作系统,并且在这个案例中,我们关注的是32位版本,适用于那些...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录...

    SQL跟踪工具 Oracle 64位

    SQLTracker是一款专为监视在Oracle数据库上运行的应用程序而设计的高效工具,尤其适用于64位Windows操作系统,如Win7和Win10。这款工具旨在帮助数据库管理员(DBA)和开发人员深入理解SQL查询的执行性能,从而优化...

    SQL Prompt 6.2 破解教程+注册机

    使用方法:断网,用Keygen算出序列号,启动SQL管理器,SQL Prompt会一起启动,然后在菜单中点击激活,把序列号输入,由于没有联网,选择手动激活,把软件生成的文字粘帖到keygen的第二栏,把第三栏自动生成的内容粘贴...

    SQLTracker Oracle跟踪工具(支持64位)

    SQLTracker是一款专为Oracle数据库设计的高性能监控工具,尤其针对64位操作系统,如win7和win10,提供强大的跟踪和分析功能。在数据库管理领域,了解并掌握SQLTracker对于提升数据库性能优化和问题排查至关重要。 ...

    sql server 导入超大SQL脚本文件

    SQL Server 是一种关系型数据库管理系统,广泛应用于各种行业。然而,在实际应用中,我们经常会遇到导入超大 SQL 脚本文件的问题。本文将介绍如何使用 osql 工具来导入超大 SQL 脚本文件。 什么是 osql? osql 是 ...

Global site tag (gtag.js) - Google Analytics