有没有办法生成可以在JOIN中使用的任意数量的行,类似于Oracle语法:
SELECT LEVEL FROM DUAL CONNECT BY LEVEL<=10
Quassnoi.. 25
讨厌这样说,但是没有这个功能的四巨头中MySQL
唯一RDBMS
.
在Oracle
:
SELECT * FROM dual CONNECT BY level < n
在MS SQL
(最多100
行):
WITH hier(row) AS ( SELECT 1 UNION ALL SELECT row + 1 FROM hier WHERE row < n ) SELECT * FROM hier
或使用提示 32768
WITH hier(row) AS ( SELECT 1 UNION ALL SELECT row + 1 FROM hier WHERE row < 32768 ) SELECT * FROM hier OPTION (MAXRECURSION 32767) -- 32767 is the maximum value of the hint
在PostgreSQL
:
SELECT * FROM generate_series (1, n)
在MySQL
,什么都没有.
讨厌这样说,但是没有这个功能的四巨头中MySQL
唯一RDBMS
.
在Oracle
:
SELECT * FROM dual CONNECT BY level < n
在MS SQL
(最多100
行):
WITH hier(row) AS ( SELECT 1 UNION ALL SELECT row + 1 FROM hier WHERE row < n ) SELECT * FROM hier
或使用提示 32768
WITH hier(row) AS ( SELECT 1 UNION ALL SELECT row + 1 FROM hier WHERE row < 32768 ) SELECT * FROM hier OPTION (MAXRECURSION 32767) -- 32767 is the maximum value of the hint
在PostgreSQL
:
SELECT * FROM generate_series (1, n)
在MySQL
,什么都没有.
在MySql中,我理解你可以使用没有表(或DUAL)的SELECT获得多行.
因此,为了得到多行,你就需要至少所需的行数的真实的或临时表.
但是,您不需要构建临时表,因为您可以使用至少具有所需行数的任何现有表.因此,如果您的表至少具有所需的行数,请使用:
SELECT @curRow := @curRow + 1 AS row_number FROM sometable JOIN (SELECT @curRow := 0) r WHERE @curRow<100;
只需将"sometable"替换为您的任何表的名称,并至少包含所需的行数.
PS:"r"是表"别名":我本可以使用"AS r".FROM或JOIN子句中的任何子查询都会创建一个"派生表",与所有表一样,它必须具有名称或别名.(参见MySql手册:13.2.9.8.FOM子句中的子查询)
由于这是Google目前“ mysql row generator”的首批结果之一,因此我将添加一个更新。
如果您的MySQL碰巧是MariaDB,则它们具有此功能。它被称为“序列存储引擎”,其用法如下:
select * from seq_1_to_10;
结果:
+-----+ | seq | +-----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +-----+ 10 rows in set (0.00 sec)
在10.0版之前,它是一个单独的插件,需要明确安装,但是从10.0版开始,它是内置的。