Pergunta

Existe uma maneira de gerar um número arbitrário de linhas que podem ser usados ??em uma associação semelhante à sintaxe Oracle:

SELECT LEVEL FROM DUAL CONNECT BY LEVEL<=10
Foi útil?

Solução

Odeio dizer isso, mas MySQL é a única RDBMS dos quatro grandes que não tem esse recurso.

Em Oracle:

SELECT  *
FROM    dual
CONNECT BY
        level < n

Em MS SQL (até linhas 100):

WITH hier(row) AS
        (
        SELECT  1
        UNION ALL
        SELECT  row + 1
        FROM    hier
        WHERE   row < n
        )
SELECT  *
FROM    hier

ou usando dica até 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

Em PostgreSQL:

SELECT  *
FROM    generate_series (1, n)

Em MySQL, nada.

Outras dicas

No MySQL, é meu entender que você pode obter mais de uma linha com um SELECT com nenhuma tabela (ou DUAL).

Portanto, para obter várias linhas, você do precisa de uma mesa real ou temporário com pelo menos o número necessário de linhas.

No entanto, você não precisa para construir uma tabela temporária como você pode usar ANY tabela que tem, pelo menos, o número de linhas necessárias existente. Então, se você tem uma tabela com pelo menos o número necessário de linhas, use:

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

Basta substituir "sometable" com o nome de qualquer tabela de vocês com pelo menos o número necessário de linhas.

PS: O "r" é uma tabela de "Alias": Eu poderia ter usado "AS r". Qualquer subconsulta em um FROM ou uma cláusula de junção cria uma "tabela derivada", que, como acontece com todas as tabelas, deve ter um nome ou alias. (Veja MySql manual:. 13.2.9.8 Subqueries na cláusula FROM)

Uma vez que este é atualmente um dos primeiros resultados no Google para "gerador de linha mysql", vou acrescentar uma atualização.

Se o seu sabor do MySQL passa a ser MariaDB, eles têm esta característica. É o chamado "Armazenamento Sequence motor" e é usado como este :

select * from seq_1_to_10;

Com os resultados:

+-----+
| seq |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
|   6 |
|   7 |
|   8 |
|   9 |
|  10 |
+-----+
10 rows in set (0.00 sec)

Até a versão 10.0 foi um plugin separado que precisava ser explicitamente instalado, mas a partir de 10,0 em diante ele é construído em. Divirta-se!

I teve uma tabela com uma coluna (c5) que continha um número x, I necessário uma expressão SQL que repetida a mesma linha x número de vezes.

A minha mesa A continha:

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

E eu precisava:

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

Eu resolvi que, com a expressão:

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;

Se eu estou entendendo você, você quer uma lista de números consequtive?

Apenas fazer a lista:

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

... etc, até que você tem, digamos, 1024.

update artificial_range set idn = id - 1 ; 

- agora você tem uma série olhando para 1 (id) e uma série começando em 0

Agora, junte-se a ele, ou juntar-se às transformações de que:

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

Não sei se isso ajuda, mas pode numerar as linhas de cada instrução SELECT com algo. como:

SET @NUM = 0;

SELECIONAR @NUM: = @ NUM + 1 RowNumber, * FROM ...

E mais tarde se juntar a eles em um presente. Em grandes bases de dados isto pode ser muito lento.

Para gerar 10 linhas:

SELECT a AS a 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 from dual

Você pode gerar 100 linhas fazendo uma junção com outras 10 linhas:

select t2.a*10 + t1.a from (SELECT 0 AS a 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 a 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

E então 1000 linhas com outra juntar-se, ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top