對於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作品抽象的觀點,沒有位操作(這無論如何是不是一個真正的必要性在這種情況下)和功能的細微差別(除去OR REPLACE
上CREATE VIEW
,只Postgresql和MySQL支持它們)在所有主要數據庫中。
甲骨文警告:只要把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
我最喜歡這個答案,因爲它很便攜。 – cygri
這個答案幫助我解決了我們查詢中的一個主要問題,並幫助我使用此代碼構建了一個全新的報告範圍。希望我能做的不僅僅是投票回答這個問題。 :) – Neels