对于 MySQL,使用穷人的generate_series,这是通过视图完成的。 MySQL 是big four 中唯一没有任何 CTE 功能的 RDBMS。
实际上你可以在支持视图的数据库上使用这种技术。这就是几乎所有的数据库
生成器技术来源:http://use-the-index-luke.com/blog/2011-07-30/mysql-row-generator#mysql_generator_code
我们所做的唯一小改动是我们将原始技术中的按位(左移和按位或)技术分别替换为仅乘法和加法;因为 Sql Server 和 Oracle 没有左移运算符。
这种抽象 99% 保证适用于所有数据库,除了 Oracle; Oracle 的SELECT 没有任何表是无法运行的,为此,需要从虚拟表中进行选择,Oracle 已经提供了一张,称为DUAL 表。数据库可移植性是白日梦:-)
这是适用于所有 RDBMS 的抽象视图,没有按位操作(在这种情况下这实际上不是必需的)和功能细微差别(我们删除了 CREATE VIEW 上的 OR REPLACE,只有 Postgresql 和 MySQL 支持它们)在所有主要数据库中。
Oracle 警告:只需将 FROM DUAL 放在每个 SELECT 表达式之后
CREATE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL
SELECT 15;
CREATE VIEW generator_256
AS SELECT ( ( hi.n * 16 ) + lo.n ) AS n
FROM generator_16 lo, generator_16 hi;
CREATE VIEW generator_4k
AS SELECT ( ( hi.n * 256 ) + lo.n ) AS n
FROM generator_256 lo, generator_16 hi;
CREATE VIEW generator_64k
AS SELECT ( ( hi.n * 256 ) + lo.n ) AS n
FROM generator_256 lo, generator_256 hi;
CREATE VIEW generator_1m
AS SELECT ( ( hi.n * 65536 ) + lo.n ) AS n
FROM generator_64k lo, generator_16 hi;
然后使用这个查询:
SELECT t.value, t.cnt, i.n
FROM tbl t
JOIN generator_64k i
ON i.n between 1 and t.cnt
order by t.value, i.n
Postgresql:http://www.sqlfiddle.com/#!1/1541d/1
甲骨文:http://www.sqlfiddle.com/#!4/26c05/1
Sql 服务器:http://www.sqlfiddle.com/#!6/84bee/1
MySQL:http://www.sqlfiddle.com/#!2/78f5b/1