我想使用select中的单行生成以下输出。
SELECT max(t1.id)+1 as new_id FROM t1;
-> 101
However I want to do
SELECT s.last_id, sequence(1..100000000) as new_id
FROM (SELECT max(table1.id)+1 as last_id FROM table1) s;
-> 101,1
-> 101,2
-> 101,3
......
-> 101,100000000
在postgreSQL中,我可以使用:
SELECT s.last_id, generate_series(1,100000000)
FROM (SELECT max(table1.id)+1 as last_id FROM table1) s; -- returns 100,000,000 rows
如何在不使用临时表的情况下在 MySQL 中执行此操作?
答案 0 :(得分:5)
略微修改布鲁诺的解决方案
SELECT (SELECT COALESCE(max(id),0)+1 FROM table1),
@rownum:=@rownum+1 new_id
FROM
(SELECT @rownum:=0) r,
(SELECT 1 UNION ALL SELECT 2) t1,
(SELECT 1 UNION ALL SELECT 2) t2,
(SELECT 1 UNION ALL SELECT 2) t3,
(SELECT 1 UNION ALL SELECT 2) t4,
(SELECT 1 UNION ALL SELECT 2) t5,
(SELECT 1 UNION ALL SELECT 2) t6,
(SELECT 1 UNION ALL SELECT 2) t7
LIMIT 100
或其他没有变量的版本
SELECT (SELECT Coalesce(MAX(id), 0) + 1
FROM table1),
t1.n * 10 + t2.n + 1 AS new_id
FROM (SELECT 0 AS 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) t1,
(SELECT 0 AS 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) t2
ORDER BY new_id
答案 1 :(得分:4)
感谢@ harper89,我在这里找到答案:
http://use-the-index-luke.com/blog/2011-07-30/mysql-row-generator#mysql_generator_code
CREATE OR REPLACE 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 OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
FROM generator_16
CROSS JOIN generator_16 hi;
CREATE OR REPLACE VIEW generator_4k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo
CROSS JOIN generator_16 hi;
CREATE OR REPLACE VIEW generator_64k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo
CROSS JOIN generator_256 hi;
CREATE OR REPLACE VIEW generator_1m
AS SELECT ( ( hi.n << 16 ) | lo.n ) AS n
FROM generator_64k lo
CROSS JOIN generator_16 hi;
现在我可以生成我想要的结果:
SELECT s.last_id, g.n as new_id FROM (SELECT max(table1.id)+1 as last_id FROM table1) s
CROSS JOIN generator_256 g
WHERE G.N BETWEEN 1 AND 100
ORDER BY g.n ASC;
使用LIMIT
是一个坏主意,因为最多一百万个行将存储在临时表中。使用where
,您不需要临时存储。
答案 2 :(得分:1)
MYSql中没有任何内容等于generate_series
。在阅读了下面的链接之后,似乎SQL除了MySQL之外都会做。
确认Here
看来你必须采取更复杂的路线,但我没有足够的经验给出答案,那里的链接和答案可能会引导你走向正确的方向。
旁注:
您可以使用LIMIT 100
仅返回100行,但似乎您需要稍微不同的内容。
答案 3 :(得分:0)
约翰,
您使用此表单:
SELECT max(t1.id)+1, @rownum:=@rownum+1 rownum
FROM (SELECT @rownum:=0) r, t1;
测试这个sql我觉得代码已经解决了。