|
|
1
5
不幸的是,数据库中的大人物没有内置的可查询数字范围伪表。或者,更一般地说,简单的纯SQL数据生成功能。就我个人而言,我认为这是一个错误 失败,因为如果他们这样做了,那么就有可能将许多目前被程序脚本(T-SQL、PL/SQL等)锁定的代码移动到纯SQL中,这对性能和代码复杂性有很多好处。 总之,从一般意义上讲,您需要的是动态生成数据的能力。 Oracle和T-SQL都支持一个WITH子句,可用于执行此操作。它们在不同的DBMS中的工作方式略有不同,MS称之为“公共表表达式”,但它们的形式非常相似。使用这些函数和递归,可以相当容易地生成一系列数字或文本值。下面是它可能的样子。。。
这无疑是相当冗长的。Oracle的递归功能是有限的。语法很笨拙,性能不好,而且它被限制在500(我想)个嵌套级别。这就是为什么我选择只对前10个数字使用递归,然后使用交叉(笛卡尔)连接将它们组合成实际的数字。 我自己并没有使用SQLServer的公共表表达式,但由于它们允许自引用,递归比Oracle中的递归简单得多。性能是否具有可比性,嵌套限制是什么,我不知道。 无论如何,递归和WITH子句在创建需要动态生成的数据集的查询时是非常有用的工具。然后通过查询该数据集,对值进行操作,可以获得各种不同类型的生成数据。聚合、复制、组合、置换等。您甚至可以使用这些生成的数据来帮助向上滚动或向下钻取其他数据。 我只想补充一点,一旦您开始以这种方式处理数据,它将为您打开思考SQL的新思路。它不仅仅是一种脚本语言。这是一个相当健壮的数据驱动系统 declarative language . 有时,使用它是一件痛苦的事情,因为多年来,它一直缺乏增强功能来帮助减少复杂操作所需的冗余。但尽管如此,它还是非常强大,并且是一种相当直观的方法,可以将数据集作为算法的目标和驱动程序。 |
|
|
2
3
我创建了一个SQL CLR表值函数,该函数非常适合此用途。
代码如下:
|
|
|
3
1
这基本上是显示SQL不太理想的因素之一。我在想也许正确的方法是构建一个函数来创建范围。(或发电机。) 我相信你的问题的正确答案基本上是“你不能”。 |
|
|
4
1
您可以在SQL2005+中使用公共表表达式来执行此操作。
|
|
|
5
0
如果使用SQL Server 2000或更高版本,则可以使用 表数据类型 避免创建普通表或临时表。然后对其使用正常的表操作。 使用此解决方案,内存中基本上有一个表结构,可以像实际表一样使用,但性能更高。 我在这里找到了一个很好的讨论: Temporary tables vs the table data type |
|
|
6
0
下面是一个你永远不应该使用的黑客:
可以使用SQL 2005中的Rank()或Row_Number函数简化此过程 |
|
John D · 需要为NULL或NOT NULL的WHERE子句 1 年前 |
|
Marc Guillot · 记录值时忽略冲突 1 年前 |
|
|
Fachry Dzaky · 正确使用ROW_NUMBER 1 年前 |
|
|
TriumphTruth · 从满足特定条件的数据集中选择1行 1 年前 |