복붙노트

[SQL] 어떻게 MySQL의에서 행 생성기를해야합니까?

SQL

어떻게 MySQL의에서 행 생성기를해야합니까?

A의 사용할 수있는 행 오라클 구문과 유사한 가입의 임의의 번호를 생성하는 방법이 있나요 :

SELECT LEVEL FROM DUAL CONNECT BY LEVEL<=10

해결법

  1. ==============================

    1.이 말을 싫어하지만, MySQL은 단지이 기능이없는 빅 4의 RDBMS입니다.

    이 말을 싫어하지만, MySQL은 단지이 기능이없는 빅 4의 RDBMS입니다.

    오라클의 경우 :

    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은, 아무것도.

  2. ==============================

    2.MySQL은, 내 당신이 어떤 테이블 SELECT (또는 DUAL) 둘 이상의 행을 얻을 수있는 것으로 알고 있습니다.

    MySQL은, 내 당신이 어떤 테이블 SELECT (또는 DUAL) 둘 이상의 행을 얻을 수있는 것으로 알고 있습니다.

    따라서, 여러 행을 얻으려면, 당신은 행의 최소한 필요한 수와 실제 또는 임시 테이블을 필요합니까.

    그러나, 당신은 당신이 필요한 행 적어도 번호가 기존 테이블을 사용할 수있는 임시 테이블을 구축 할 필요가 없습니다. 그래서, 당신은 행의 최소한 필요한 수있는 테이블이있는 경우, 사용 :

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

    다만 행의 최소 요구 번호 당신의 모든 테이블의 이름으로 "sometable"대체합니다.

    추신 : "r은"테이블 "별명"입니다 : 나는 "R 그대로"사용했을 수 있습니다. 또는 FROM A의 모든 하위 쿼리 절은 모든 테이블과 같은 이름이나 별명을 가지고 있어야하는 "파생 테이블"을 만들어 가입하세요. (수동 참조 MySQL의 : 13.2.9.8 FROM 절에서 서브 쿼리.)

  3. ==============================

    3.이 현재 "MySQL의 행 발전기"에 대한 구글의 첫 결과 중 하나이기 때문에, 나는 업데이 트를 추가합니다.

    이 현재 "MySQL의 행 발전기"에 대한 구글의 첫 결과 중 하나이기 때문에, 나는 업데이 트를 추가합니다.

    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에서이 내장입니다. 즐기십시오!

  4. ==============================

    4.나는 숫자 X가 포함 된 열 (C5)와 테이블을했다, 나는 시간의 같은 행의 X 번호를 되풀이 SQL 식을 필요로했다.

    나는 숫자 X가 포함 된 열 (C5)와 테이블을했다, 나는 시간의 같은 행의 X 번호를 되풀이 SQL 식을 필요로했다.

    내 테이블 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
    

    나는 표현과 그 해결 :

    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;
    
  5. ==============================

    5.내가 당신을 이해 해요 경우 연속 번호 목록을 줄까?

    내가 당신을 이해 해요 경우 연속 번호 목록을 줄까?

    그냥 목록을 작성 :

    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에서 시작

    지금에 가입, 또는 그것의 변형에 가입 :

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

    6.이 도움이 나도 몰라하지만 당신은 STH 각 select 문에서 행 번호를 수 있습니다. 처럼:

    이 도움이 나도 몰라하지만 당신은 STH 각 select 문에서 행 번호를 수 있습니다. 처럼:

    그리고 나중에 하나를 가입 할 수 있습니다. 큰 데이터베이스에서이 매우 느려질 수 있습니다.

  7. ==============================

    7.10 개 행을 생성하려면 :

    10 개 행을 생성하려면 :

    AS SELECT 이중에서 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT UNION ALL SELECT 6 7 8 UNION ALL SELECT UNION ALL SELECT 9

    당신은 다른 10 개의 행으로 참여하고 100 개의 행을 생성 할 수 있습니다 :

    에서 T2.A * 10 + T1.A을 선택     T1 (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 UNION ALL SELECT 8 9 0을 선택),     T2 (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 UNION ALL SELECT 8 9 0을 선택)

    그리고 서로 후 1000 행이 조인 ...

  8. ==============================

    8., 당신은 할 수 있지만 약간의 비트가 까다로운

    , 당신은 할 수 있지만 약간의 비트가 까다로운

    여기있어:

    mysql> create table t(inc bigint primary key auto_increment);
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> insert into t values(0);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t select 0 from t;
    Query OK, 1 row affected (0.02 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> insert into t select 0 from t;
    Query OK, 2 rows affected (0.02 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> insert into t select 0 from t;
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> insert into t select 0 from t;
    Query OK, 8 rows affected (0.01 sec)
    Records: 8  Duplicates: 0  Warnings: 0
    
    mysql> select count(inc), max(inc) from t;
    +------------+----------+
    | count(inc) | max(inc) |
    +------------+----------+
    |         16 |       20 |
    +------------+----------+
    1 row in set (0.00 sec)
    
    mysql> select row_number() over w as inc from t window w as (order by inc);
    +-----+
    | inc |
    +-----+
    |   1 |
    |   2 |
    |   3 |
    |   4 |
    |   5 |
    |   6 |
    |   7 |
    |   8 |
    |   9 |
    |  10 |
    |  11 |
    |  12 |
    |  13 |
    |  14 |
    |  15 |
    |  16 |
    +-----+
    16 rows in set (0.00 sec)
    

    당신은 문을 실행하여 생성 된 행의 수를 두배로 할 수있다

    insert into t select 0 from t;
    

    만큼 당신이 필요로하는.

    또한 기본적으로 그 AUTO_INCREMENT이의 이유 ROW_NUMBER ()를 사용하는 것이 어떤 차이를 발생주의.

  9. from https://stackoverflow.com/questions/701444/how-do-i-make-a-row-generator-in-mysql by cc-by-sa and MIT license