如何在MySQL中创build一个行生成器?

有没有办法生成任意数量的行,可以在类似于Oracle语法的JOIN中使用:

SELECT LEVEL FROM DUAL CONNECT BY LEVEL<=10 

讨厌这样说,但是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来获取多行。

因此,要获得多行,您需要至less具有所需行数的实际表或临时表。

但是, 您不需要构build临时表,因为您可以使用任何至less具有所需行数的现有表。 所以,如果你有一个至less有所需行数的表,使用:

 SELECT @curRow := @curRow + 1 AS row_number FROM sometable JOIN (SELECT @curRow := 0) r WHERE @curRow<100; 

只需用至less所需的行数replace“sometable”与你的任何表的名称。

PS:“r”是表“别名”:我可以使用“AS r”。 FROM或JOIN子句中的任何子查询都会创build一个“派生表”,与所有表一样,它必须具有名称或别名。 (请参阅MySql手册:13.2.9.8。FROM子句中的子查询)

你考虑过一个左外连接吗?

我不知道这是否有帮助,但你可以从每个select语句的行编号。 喜欢:

SET @NUM = 0;

SELECT @NUM:= @ NUM + 1 rowNumber,* FROM …

后来join他们这一个。 在大型数据库中,这可能非常缓慢。

如果我理解你,你想要一个连续的数字列表?

只要列出:

 create table artificial_range (id int not null primary key auto_increment, idn int); insert into artificial_range (idn) values (0); --first row insert into artificial_range(idn) select idn from artificial_range; --2nd insert into artificial_range(idn) select idn from artificial_range; -- now 4 rows insert into artificial_range(idn) select idn from artificial_range; --8 insert into artificial_range(idn) select idn from artificial_range; --16 insert into artificial_range(idn) select idn from artificial_range; --32 insert into artificial_range(idn) select idn from artificial_range; --64 insert into artificial_range(idn) select idn from artificial_range; --128 

等等,直到你有1024,

 update artificial_range set idn = id - 1 ; 

– 现在你有一个系列凝视1(id)和一系列从0开始

现在join到它,或join到它的转换:

  create view days_this_century as select date_add('2000-01-01', interval a.idn day) as cdate from artificial_range; 

我有一个包含数字x的列( c5 )的表,我需要一个SQLexpression式重复相同的行x次。

我的桌子A包含:

 c1 c2 c3 c4 c5 16 1 2 16 3 16 1 2 17 2 16 1 2 18 1 

我需要:

 c1 c2 c3 c4 c5 n 16 1 2 16 3 1 16 1 2 16 3 2 16 1 2 16 3 3 16 1 2 17 2 1 16 1 2 17 2 2 16 1 2 18 1 1 

我用expression式解决了这个问题:

 SELECT c1, c2, c3, c4, c5, row_number AS n FROM ( SELECT @curRow := @curRow + 1 AS row_number FROM tablea JOIN (SELECT @curRow := 0) r WHERE @curRow < ( SELECT max(field1) FROM tablea ) ) AS vwtable2 LEFT JOIN tablea d ON vwtable2.row_number <= tablea.field1;