복붙노트

[SQL] SQL SELECT 첫 번째 N 양의 정수를 얻을 수 있습니다

SQL

SQL SELECT 첫 번째 N 양의 정수를 얻을 수 있습니다

나는 처음 N 양의 정수를 포함하는 결과 집합을 얻을 필요가있다. 그것은 (제공되는 카운트 테이블없이)을 얻을 만 표준 SQL SELECT 문을 사용할 수 있습니까?

그것이 불가능하면,이를 달성하기 위해 특정의 MySQL의 방법은 무엇입니까?

해결법

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

    1.당신이 원하는 것은 더미 행 집합 것 같다.

    당신이 원하는 것은 더미 행 집합 것 같다.

    MySQL은, 그것은 테이블을하지 않고 불가능합니다.

    대부분의 주요 시스템은 그것을 할 수있는 방법을 제공합니다 :

    MySQL은 이런 식으로 뭔가 부족이 심각한 단점이다.

    나는 아마 사용이 될 것입니다, 내 블로그 게시물에 샘플 테이블에 대한 테스트 데이터를 생성하는 간단한 스크립트를 작성 :

    CREATE TABLE filler (
            id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
    ) ENGINE=Memory;
    
    CREATE PROCEDURE prc_filler(cnt INT)
    BEGIN
            DECLARE _cnt INT;
            SET _cnt = 1;
            WHILE _cnt <= cnt DO
                    INSERT
                    INTO    filler
                    SELECT  _cnt;
                    SET _cnt = _cnt + 1;
            END WHILE;
    END
    $$
    

    당신은 프로 시저를 호출하고, 테이블은 숫자로 채워집니다.

    당신은 세션이 지속되는 동안 그것을 다시 사용할 수 있습니다.

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

    2.가능한 솔루션 (시피 매우 우아 생략) 레코드가 충분히 많은 수의 모든 테이블을 사용하는 것이다.

    가능한 솔루션 (시피 매우 우아 생략) 레코드가 충분히 많은 수의 모든 테이블을 사용하는 것이다.

    처음 10 개 정수를 들어합니다 (mysql.help_relation를 사용하지만, 모든 테이블이 할 것), 다음과 같은 쿼리를 사용할 수 있습니다 :

    SELECT  @N := @N +1 AS integers 
    FROM mysql.help_relation , (SELECT @N:=0) dum LIMIT 10;
    

    이것은 또한 최소 및 최대를 복용 함수에 배치 될 수있다.

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

    3.이상한 솔루션,하지만 ...

    이상한 솔루션,하지만 ...

    SELECT 1 UNION SELECT 2 UNION SELECT 3....
    
  4. ==============================

    4.내가 제안하는 순서는 다음과 같은 쿼리를 실행하는 프로그래머를 할 수 있습니다 :

    내가 제안하는 순서는 다음과 같은 쿼리를 실행하는 프로그래머를 할 수 있습니다 :

    select value from sequence where value>=15 and value<100;
    

    그리고 예상되는 결과를 얻었다 : 정수 시퀀스 15 (포함) 100 (배타적) 사이.

    만약 당신이 원하는 경우에, 당신은, 당신은 한 번만 선언거야 뷰를 다음 두 가지 뷰를 생성해야합니다 :

    create view digits as select 0 n union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9;
    
    create view sequence as select u.n+t.n*10+h.n*100 as value from digits as u cross join digits as t cross join digits as h;
    

    이 방법 당신은 직관적 인 선택하여 순서를 가지고 ...

    희망이 도움이.

  5. ==============================

    5.당신이 표를 받아옵니다 의미 가정, 여기서 N은 intcolumn를 가정하는 것은 그것의 숫자와 열입니다, 10입니다.

    당신이 표를 받아옵니다 의미 가정, 여기서 N은 intcolumn를 가정하는 것은 그것의 숫자와 열입니다, 10입니다.

    SELECT intcolumn FROM numbers WHERE intcolumn > 0 LIMIT 10
    

    편집 : 당신이 실제로 테이블없이 양수의 수학적 세트를 얻기 위해 찾고 있던 경우에, 나는 그것이 (구현에 따라)를 많이 사용할 수 있습니다, 재고 것입니다. 일반적으로 받아 들여지는 관행은 숫자의 전체 조회 테이블을 만든 다음 위의 쿼리를 사용하는 것 같다.

  6. ==============================

    6.이 5 월 도움

    이 5 월 도움

    범위의 임의의 정수 R을 구 I <= R

    SELECT FLOOR (7 + (RAND () * 5));

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

    7.당신이 N이 제한되어 있음을 알고 (그리고 보통이다) 경우에는 건설 등으로 사용할 수 있습니다 :

    당신이 N이 제한되어 있음을 알고 (그리고 보통이다) 경우에는 건설 등으로 사용할 수 있습니다 :

    select (a.digit + (10 * b.digit) + (100 * c.digit) + (1000 * d.digit) + (10000 * e.digit) + (100000 * f.digit)) as n
        from (select 0 as digit 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) as a
        cross join (select 0 as digit 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) as b
        cross join (select 0 as digit 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) as c
        cross join (select 0 as digit 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) as d
        cross join (select 0 as digit 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) as e
        cross join (select 0 as digit 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) as f;
    

    이는 첫 번째 만 개 번호를 생성합니다. 당신은 단지 양수가 필요한 경우, 단순히 표현 + 1을 추가합니다.

    특히 MySQL의에서 결과가 정렬되지 않을 수 있습니다. 당신은 당신이 주문 번호를 필요로하는 경우 마지막에 n으로 순서를 추가해야합니다. 하지만 이것은 (내 컴퓨터에서, 그것은 500 밀리 5 MS에서 뛰어), 극적으로 실행 시간을 증가시킬 것이다.

    간단한 쿼리의 경우, 여기에 단지 첫 번째 10000 개 번호에 대한 쿼리는 다음과 같습니다

    select (a.digit + (10 * b.digit) + (100 * c.digit) + (1000 * d.digit)) as n
        from (select 0 as digit 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) as a
        cross join (select 0 as digit 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) as b
        cross join (select 0 as digit 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) as c
        cross join (select 0 as digit 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) as d;
    

    https://stackoverflow.com/a/2157776/2948 :이 답변은 날짜 범위를 반환하는 다음의 쿼리에서 적응

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

    8.내가 제대로 질문을 이해한다면 확신 나는 '당신이 그것을 할 수 없다.

    내가 제대로 질문을 이해한다면 확신 나는 '당신이 그것을 할 수 없다.

    나는 특정 테이블을 참조 할 필요없이, 당신은 하나의 SQL 문에서, 목록을 원하는 질문을 이해?

    나는 그것이 어떤 SQL 언어에 불가능하다고 확신합니다. 다른 쿼리의 결과와 함께 순차적으로 증가하는 번호를한다면, 그는 ROWNUMBER () 것 MSSQL에, SQL 언어에 따라 (가능할 것이다,하지만 어떻게 MySQL은 잘 모르겠지만, 그것은 아마 그곳에)

    하지만 난 당신이 물어 듣는 게 아니에요?

  9. ==============================

    9.하여 followhing SO 문제를 살펴 보자 :

    하여 followhing SO 문제를 살펴 보자 :

    편집하다:

    또 다른 방법은 당신을 위해 수행하는 저장 프로 시저를 만드는 것입니다. PostgreSQL은 당신이 원하는 않는 함수 generate_series (시작, 정지)가 포함되어 있습니다.

    select * from generate_series(2,4);
     generate_series
    -----------------
                   2
                   3
                   4
    (3 rows)
    

    내가 MySQL을 잘 알고 모르겠지만 그런 식으로 뭔가를해야만하는 것은 당신의 SPS 좋아하면 쉽게 구현할 수 있어야한다. 이 사이트는 구현을 보여줍니다.

  10. ==============================

    10.데이터베이스가 분석 윈도우 기능을 지원하는 경우 다음이 정말 잘 간단한 일입니다 :

    데이터베이스가 분석 윈도우 기능을 지원하는 경우 다음이 정말 잘 간단한 일입니다 :

    SELECT  row_number() over (partition by 1 order by 1) numbers
    FROM SOME_TABLE
    LIMIT 2700;
    

    이 문장은 1에서 2700까지 숫자의 집합을 반환합니다.

  11. from https://stackoverflow.com/questions/1475973/sql-select-to-get-the-first-n-positive-integers by cc-by-sa and MIT license