对于 MySQL,使用穷人的generate_series,这是通过视图完成的。MySQL 是四大中唯一没有任何 CTE 功能的 RDBMS。
实际上,您可以在支持视图的数据库上使用此技术。这就是几乎所有的数据库
源自此处的生成器技术:http: //use-the-index-luke.com/blog/2011-07-30/mysql-row-generator#mysql_generator_code
我们所做的唯一小的修改是我们分别用乘法和加法替换了原始技术中的按位(左移和按位或)技术;因为 Sql Server 和 Oracle 没有左移运算符。
这种抽象 99% 保证适用于除 Oracle 之外的所有数据库;OracleSELECT
没有任何表是无法运行的,为此,需要从 dummy table 中进行选择,Oracle 已经提供了一张,它被称为DUAL
table。数据库可移植性是一个白日梦:-)
这是适用于所有 RDBMS 的抽象视图,在所有主要数据库中没有按位操作(在这种情况下无论如何都不是必需的)和功能细微差别(我们删除OR REPLACE
on CREATE VIEW
,只有 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