Help us understand the problem. What is going on with this article?

CROSS JOINを使って連番を生成する

More than 1 year has passed since last update.

1~10,000の連番をSQLだけで作る方法です。

クエリ

SQLServerでやるとこうなります。

CREATE TABLE #nums (
    num int
)
;

-- 元になる数値を用意
INSERT INTO #nums
VALUES
    (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
;

-- 必要な桁数分 cross join する
SELECT
    digit1.num + digit2.num * 10 + digit3.num * 100 + digit4.num * 1000 + 1 AS result
FROM
    #nums digit1 CROSS JOIN #nums digit2 CROSS JOIN #nums digit3 CROSS JOIN #nums digit4
ORDER BY result
;

解説

CROSS JOINは行数x行数が最終的に結合された結果の行数になります。そのため今回は
10x10x10x10=10000件の0~9までの数字の組み合わせになります。

結合イメージ
スクリーンショット 2019-02-16 0.47.04.png

上記画像は9を起点にした矢印以外は省略していますが、このように全てのレコード同士が結びつきます。結果出来上がるレコードは下図のような形式です。
スクリーンショット 2019-02-16 0.53.34.png

このままではただの独立した4つの数字が存在してるだけであり、桁数ごとに適切に計算する必要があります。ここで

1桁目+2桁目x10+3桁目x100+4桁目x1000+1

という計算式を当てはめることで漏れなく連番が求まります。

zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away