MySQLの場合、ビューを介して実行される貧乏人のgenerate_seriesを使用します。MySQLは、 CTE機能を持たないビッグ4の中で唯一のRDBMSです。
実際には、ビューをサポートするデータベースでこの手法を使用できます。つまり、これは事実上すべてのデータベースです
ここで提供されるジェネレーター手法:http://use-the-index-luke.com/blog/2011-07-30/mysql-row-generator#mysql_generator_code
私たちが行った唯一の小さな変更は、元の手法からビット単位(左シフトとビット単位または)の手法を、それぞれ単なる乗算と加算に置き換えることです。SQLServerとOracleには左シフト演算子がないためです。
この抽象化は、Oracleを除くすべてのデータベースで機能することが99%保証されています。OracleSELECT
はテーブルなしでは機能できません。これを行うには、ダミーテーブルから選択する必要があります。Oracleはすでにテーブルを提供しています。これはDUAL
テーブルと呼ばれます。データベースの移植性は夢のようなものです:-)
これは、すべてのRDBMSで機能する抽象化されたビューであり、ビット単位の操作(このシナリオでは実際には必要ではありません)と、すべての主要なデータベースの特徴のニュアンス(PostgresqlとMySQLのみがサポートします)OR REPLACE
を欠いています。CREATE VIEW
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
Oracle:http ://www.sqlfiddle.com/#!4/26c05/1
SQL Server:http ://www.sqlfiddle.com/#!6/84bee/1
MySQL:http ://www.sqlfiddle.com/#!2/78f5b/1