首先声明一点,文章内容从itpub论坛上看到的,原文链接外链网址已屏蔽,本文主要是记录下笔记,原文中有更详细的分析。使用sql求质素没什么实用价值,重要的是思路。

(一)最简单的方法

思路:将2和所有大于等于3小于XX的奇数取出来,做一中间结果集t。然后逐一校验t中的每个N是否是质数。如果发现一个数字N不能被其他所有数字整除——当然,这些数字要小于等于SQRT(N),那么N就是质数

with t as(select 2 n from dual union select rownum*2+1 from dual connect by rownum<=(10000-2)/2)

select count(*) from t a where not exists (select null from t b where b.n<=sqrt(a.n) and mod(a.n, b.n)=0)

最直接的方法,可惜速度最慢。

(二)筛选法

思路:将从2到XX的数都列出来,作为一个全集,然后减去所有的合数,即可得到素数集合

WITH t AS (

SELECT ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000-1)

SELECT COUNT(*)

FROM (SELECT rn

from t

MINUS

SELECT t1.rn * t2.rn--4=2*2 2*3 9=3*3 3*4 16=4*4 4*5

FROM t t1, t t2

WHERE t1.rn <= t2.rn

AND t1.rn <= (SELECT SQRT(10000) FROM DUAL))

(三)改进的筛选法

思路:除了2之外的偶数,可以从全集和合数集中排除

WITH t AS (

--2-10000/2

SELECT ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000/2-1

)

,t_odd AS (

--奇数

SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000/2-1

)

SELECT COUNT(*) + 1--+2

FROM (SELECT rn

from t_odd

MINUS

SELECT t1.rn * t2.rn

FROM t t1, t t2

WHERE t1.rn <= t2.rn

AND t1.rn <= (SELECT SQRT(10000) FROM DUAL)

AND t1.rn * t2.rn < 10000)

另一种写法:排除偶数

WITH t_odd AS (

SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= 10000/2-1

)

SELECT COUNT(*) + 1

FROM (SELECT rn

from t_odd

MINUS

SELECT t1.rn * t2.rn --9=3*3 3*5 25=5*5 5*7 49=7*7

FROM t_odd t1, t_odd t2

WHERE t1.rn <= t2.rn

AND t1.rn <= (SELECT SQRT(10000) FROM DUAL)

AND t1.rn * t2.rn < 10000)

(四)逆向exists

with t as(select 2 n from dual union select rownum*2+1 from dual connect by rownum<=(10000-2)/2)

, z as (select * from t minus

select * from t a where exists (select null from t b where b.n<=sqrt(a.n) and mod(a.n, b.n)=0))

select count(*) from z

或者:

with t as(select rownum*2+1 n from dual connect by rownum<=(10000-2)/2

union select 3 from dual --F5执行计划 走MERGE JOIN

),z as (select * from t minus

select * from t a where exists (select null from t b where b.n<=sqrt(a.n) and mod(a.n, b.n)=0))

select count(*)+1 from z

加了union select 3 from dual 之后,执行计划走MERGE JOIN,这一点还没想明白,欢迎指教。

(五)提前剔除奇数

WITH t0 AS (

SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (10000)/2-1

),

t as(SELECT rn from t0 where mod(rn,3)<>0 and mod(rn,5)<>0 and mod(rn,7)<>0 and mod(rn,11)<>0 and mod(rn,13)<>0 and mod(rn,17)<>0 and mod(rn,19)<>0)

SELECT COUNT(*) + 1 + 7 --2,3,5,7,11,13,17,19

FROM (SELECT rn

from t

MINUS

SELECT t1.rn * t2.rn

FROM t t1, t t2

WHERE t1.rn <= t2.rn

AND t1.rn BETWEEN 9 AND (SELECT SQRT(10000) FROM DUAL)

AND t1.rn * t2.rn < 10000)

其实后面的大部分写法都是采用提前筛选掉不合格的数字来减少源数据大小达到加快查询速度。

全文完。

oracle质数怎么算,借花献佛之使用Oracle sql求质数(笔记)相关推荐

  1. oracle测试报告模板,Oracle与集算器对照测试报告

    1.测试目的 针对相同的硬件环境和计算任务,对比Oracle和集算器的性能差异,为客户选型提供参考. 2.硬件环境 设备数量:1台 CPU:16核Intel(R) Xeon(R) CPU E5620  ...

  2. oracle自动加一天,如何将Oracle 当前日期加一天、一分钟

    在Oralce中我发现有add_months函数,加天数N可以用如下方法实现,select sysdate+N from dual sysdate+1 加一天 sysdate+1/24 加1小时 sy ...

  3. Oracle教学辅助.书写历史的甲骨文--ORACLE公司传奇

    书写历史的甲骨文--ORACLE公司传奇 作者: Fenng | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://www.dbanotes.net/dat ...

  4. sql server 2008连接oracle操作步骤详细记录,SQLServer连接Oracle详细步骤

    我们知道SQL Server和Oracle其实很多原理都类似.特别是一些常用的SQL语句都是按照标准来.所以它们也可以有一定的互操作性的.这里 我们知道SQL Server和Oracle其实很多原理都 ...

  5. oracle官网能用的账号,oracle 官方登录账号Oracle的在windows下的安装及使用

    一:官网下载oracle数据库 这里我下载的是oracle 11g r2,根据自己的操作系统选择相应的下载文件,我这里是windows 64位的,所以选择第二个,点击see all 点击accept ...

  6. oracle server process,KI视角下的ORACLE SERVER PROCESS进程的活动

    1.Server Process oracle的服务进程也称为shadow进程,主要是用于响应客户端请求执行相关的SQL语句,该进程运行的效率会对oracle的客户端的操作人员的体验产生很大的影响,o ...

  7. oracle双机切换 无法挂载,Linux下Oracle RAC一个节点宕机导致共享存储无法挂载的故障排除...

    环境:两台HP ML570 Linux AS4.5 Oracle 10g两台Server做了Oracle的RAC,通过SAN Switch连接到HP MSA1000故障现象:因为其中一个Ora 环境: ...

  8. oracle怎么打代码,使用DOS打Oracle代码技巧

    初学者学习Oracle时一般会用SQP*Plus打Oracle代码,但是Oracle10的是不可以复制黏贴操作,所以需要用DOS来操作,更简单,当然SQL*Plus也有自己的优点 要使用DOS,先要配 ...

  9. oracle电子商务套件视频,Oracle电子商务套件培训 Oracle EBS R12 制造模块培训视频教程 Oracle管理套件教程...

    Oracle电子商务套件培训 Oracle EBS R12 制造模块培训视频教程 Oracle管理套件教程│  ├<01> │  │  ├00_ERP基本原理-概念补充.pdf │  │  ...

最新文章

  1. 希捷硬盘读取固件区数据
  2. python itchat 无法登录_利用python实现在微信群刷屏的方法
  3. 前端学习(41):背景实现视觉差效果
  4. pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org',
  5. linux服务器如何添加sudo用户
  6. 【SSH框架】之Spring系列(一)
  7. 性能指标之速率、带宽、吞吐量
  8. netfilter/iptables模块功能中文介绍
  9. VS2010与VS2012变化的快捷键
  10. 虚拟麦克风音频输入_收音和录音一次性解决了,这个机顶麦克风可以录音?
  11. 弹出框--用css实现div在页面居中(水平垂直居中效果)
  12. 智能优化算法:饥饿游戏搜索算法-附代码
  13. 二级备考:ppt自学知识笔记--基础操作1:ppt界面介绍
  14. cocos2d-x中使用CCSprite拼接有缝隙
  15. 网络游戏引入人工智能:游戏玩家并非真人
  16. clk子系统 - 代码分析
  17. php微信群,PHP微信群加群强制分享转发裂变源码
  18. 时间复杂度O(n)什么意思
  19. Matlab生成stm32代码
  20. 001:你好Direct 2D! 在对话框中初次使用D2D

热门文章

  1. Silverlight与JavaScript通信
  2. 看oracle 的数据库位数
  3. 订阅号助手App发布 手机也能管理公众号了
  4. 239 Sliding Window Maximum 滑动窗口最大值
  5. Jmeter和LoadRunner的区别
  6. 理解vue赋值新属性
  7. 如何获取当前点击元素的某个子元素
  8. Spring使用总结
  9. Zabbix 2.4.5 自定义 key 监控 apache
  10. rhce linux下如何配置lvs高可用集群