如何在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;