通过SQL绘制杨辉三角的实现方法介绍

 更新时间:2013年04月19日 10:57:25   作者:  
本篇文章小编为大家介绍,通过SQL绘制杨辉三角的实现方法介绍。需要的朋友参考下

无意中在csdn上看到一帖有关绘制杨辉三角的sql表达式,感觉很有意思。后来自己想下不借助临时表,根据杨辉三角的组合数计算方法C(n,m)=n!/[m!(n-m)!],进行绘制。

以下是完整的SQL代码:

复制代码 代码如下:

use tempdb
go
set nocount on
declare @rows int=10, --行数,根据实际来控制
        @x int=1,@y int=1,@sql nvarchar(max),@cols int

/*
根据杨辉三角的组合数计算方法:C(n,m)=n!/[m!(n-m)!]进行绘制
参照:http://baike.baidu.com/view/7804.htm
*/

set @cols=@rows*2-1
;with cte_n as
(
    select r from (select row_number() over(order by a.object_id) as r from sys.all_columns a ) x where r<=@rows*2
)
,cte_1 as(select n.r,b.data_lse
            from cte_n n
                cross apply(select 'select '+stuff((select ',rtrim('+isnull(F1.v+'/(('+F2.v+')*'+F3.v+')','''''') +') as '+quotename(isnull(nullif((m.r +(@rows-n.r)+(m.r-1)*1)%@cols,0),@cols))
                                from cte_n m
                                    outer apply(select stuff((select '*'+rtrim(i.r) from cte_n i where i.r<=isnull((nullif(n.r-1,0)),1) for xml path('')),1,1,'') as v
                                        ) F1
                                    outer apply(select stuff((select '*'+rtrim(i.r) from cte_n i where i.r<=isnull((nullif(m.r-1,0)),1) for xml path('')),1,1,'') as v
                                        ) F2
                                    outer apply(select stuff((select '*'+rtrim(i.r) from cte_n i where i.r<=isnull((nullif(n.r-m.r,0)),1) for xml path('')),1,1,'') as v
                                        ) F3
                                where m.r<@rows*2
                                order by isnull(nullif((m.r +(@rows-n.r)+(m.r-1)*1)%@cols,0),@cols) asc
                                for xml path('')                                   
                                ),1,1,'') as data_lse
                            )b
                where n.r <=@rows
            )

    select @sql=isnull(@sql+' union all ','')+data_lse from  cte_1
exec(@sql)


(【注】:当前脚本在SQL Server 2012上测试通过)

效果图:



这方法虽然没有借助临时表,也有一个最大的不足就是不能设置太多行,因为在公式(C(n,m)=n!/[m!(n-m)!])中有n! 和m! 算式,设置行数太多会导致阶乘数据太大,发生数据类型转换溢出。有时间再想办法看能否从表示式中"/"除位置进行优化

相关文章

  • 远程连接局域网内的sql server 无法连接 错误与解决方法

    远程连接局域网内的sql server 无法连接 错误与解决方法

    下面我们依次介绍如何来解决这三个最常见的连接错误。
    2009-09-09
  • SQL Server 压缩日志与减少SQL Server 文件大小的方法

    SQL Server 压缩日志与减少SQL Server 文件大小的方法

    这篇文章主要为大家描述的是实现SQL Server 压缩日志与SQL Server 文件大小的实际操作步骤,在此实际操作中我们要按步骤一步一步的进行,未进行前面的步骤时,请不要做后面的步骤,以免损坏你的数据库
    2014-07-07
  • SQL Server中函数、存储过程与触发器的用法

    SQL Server中函数、存储过程与触发器的用法

    这篇文章介绍了SQL Server中函数、存储过程与触发器的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • MAC 中mysql密码忘记解决办法

    MAC 中mysql密码忘记解决办法

    这篇文章主要介绍了MAC 中mysql密码忘记解决办法的相关资料,需要的朋友可以参考下
    2017-03-03
  • 还原Sql Server数据库BAK备份文件的3种方式以及常见错误总结

    还原Sql Server数据库BAK备份文件的3种方式以及常见错误总结

    日常后端开发中,我们有时候需要查看之前备份数据库的信息用于排错纠正项目问题,下面这篇文章主要给大家介绍了关于还原Sql Server数据库BAK备份文件的3种方式以及常见错误的相关资料,需要的朋友可以参考下
    2023-02-02
  • SQLServer日志收缩的两种方法实现

    SQLServer日志收缩的两种方法实现

    日志文件撑爆了磁盘,log文件不能再存储新的transaction log,本文主要介绍了SQLServer日志收缩的两种方法实现,文中通过图文示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • sqlserver中操作主从关系表的sql语句

    sqlserver中操作主从关系表的sql语句

    在项目开发中,经常出现这样的需求。在新增或修改一个主表数据时,对应的从表也要进行同步,此时我们是怎么操作的了?
    2011-07-07
  • SQL Server中通用数据库角色权限的处理详解

    SQL Server中通用数据库角色权限的处理详解

    这篇文章主要给大家介绍了关于SQL Server中通用数据库角色权限处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • SQL SERVER 2000安装教程图文详解

    SQL SERVER 2000安装教程图文详解

    本篇文章介绍了安装SQL Server 2000各版本的软硬件配置要求,企业版安装过程的详细步骤,以及需要注意的事项。其他版本可以参考安装
    2013-05-05
  • SQL中not in与null值的具体使用

    SQL中not in与null值的具体使用

    本文主要介绍了SQL中not in与null值的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01

最新评论