对于MySQL,使用穷人的generate_series,这是通过视图完成的。MySQL是四大公司中唯一没有CTE功能的RDBMS
。
实际上,您可以在支持视图的数据库上使用此技术。所以这实际上是所有数据库
生成器技术源自此处:http : //use-the-index-
luke.com/blog/2011-07-30/mysql-row-generator#mysql_generator_pre
我们所做的唯一较小的修改就是我们分别用单纯的乘法和加法替换了原始技术中的按位( 左移 和 按位or )技术。因为Sql
Server和Oracle没有左移运算符。
保证99%的抽象都可以在除Oracle之外的所有数据库上运行;Oracle
SELECt不能没有任何表,为了做到这一点,需要从虚拟表中选择一个,Oracle已经提供了一个表,称为
DUAL表。数据库可移植性是梦dream以求的:-)
这是适用于所有RDBMS的抽象视图,在所有主要数据库中都没有按位操作(在这种情况下,这实际上并不是必需的)和细微差别(我们删除
ORREPLACE了
CREATE VIEW,仅Postgresql和MySQL支持它们)。
Oracle警告:
FROM DUAL在每个
SELECt表达式之后
CREATE VIEW generator_16AS 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_256AS SELECT ( ( hi.n * 16 ) + lo.n ) AS n FROM generator_16 lo, generator_16 hi;CREATE VIEW generator_4kAS SELECt ( ( hi.n * 256 ) + lo.n ) AS n FROM generator_256 lo, generator_16 hi;CREATE VIEW generator_64kAS SELECt ( ( hi.n * 256 ) + lo.n ) AS n FROM generator_256 lo, generator_256 hi;CREATE VIEW generator_1mAS SELECt ( ( hi.n * 65536 ) + lo.n ) AS n FROM generator_64k lo, generator_16 hi;
然后使用以下查询:
SELECt t.value, t.cnt, i.nFROM tbl tJOIN generator_64k i ON i.n between 1 and t.cntorder by t.value, i.n
PostgreSQL:http://www.sqlfiddle.com/#!1
/ 1541d /
1
甲骨文:http :
//www.sqlfiddle.com/#!4/26c05/1
SQL
Server:http://www.sqlfiddle.com/#!6 /
84bee / 1
MySQL:http://www.sqlfiddle.com/#!2 /
78f5b / 1



