に応じて複数回、私はこの形式のテーブルを持っていると言うことができますそれぞれの行を選択します。SQLは、行の値
ID value
1 2
2 1
3 4
各行にvalue
回を選択する最も効率的方法は何ですか?
クエリの所望の出力を使用すると、数字のテーブルを持っている場合は、あなたが行うことができます
ID
1
1
2
3
3
3
3
に応じて複数回、私はこの形式のテーブルを持っていると言うことができますそれぞれの行を選択します。SQLは、行の値
ID value
1 2
2 1
3 4
各行にvalue
回を選択する最も効率的方法は何ですか?
クエリの所望の出力を使用すると、数字のテーブルを持っている場合は、あなたが行うことができます
ID
1
1
2
3
3
3
3
です:
select t.id
from t join
numbers n
on n.n <= t.value;
番号テーブルを構築するための様々な方法があります。ここではほとんどのデータベースで動作強引な方法です:
番号表を使用してselect t.id
from t join
(select 1 as n union all select 2 union all select 3) n
on n.n <= t.value;
..
select id from #test t
cross apply
(select N from dbo.numbers where n<t.num) b
出力:
id
1
1
2
3
3
3
3
DECLARE @MAX int;
SET @MAX = (SELECT MAX(VALUE) from vTable);
WITH R AS (SELECT 1 N
UNION ALL
SELECT N + 1 FROM R WHERE N < @MAX),
AllROWS AS (SELECT
V.ID ,
V.Value,
row_number() OVER (Partition BY v.id ORDER BY v.id) CNT
FROM vTable v
CROSS JOIN
R)
SELECT ID FROM ALLROWS WHERE CNT <= value
option(maxrecursion 0)
が、私は、上記のovercomplicatedあなただけが必要です
DECLARE @MAX int;
SET @MAX = (SELECT MAX(VALUE) from vTable);
WITH R AS (SELECT 1 N
UNION ALL
SELECT N + 1 FROM R WHERE N < @MAX)
SELECT vTable.ID FROM R CROSS JOIN vTable WHERE R.N <= vTable.value ORDER BY vTable.Id
option(maxrecursion 0)
「vTable」とは何ですか? –
@Bogdan Bogdanov - それは私がIDと価値のあるテーブルを呼び出したものです - 私はそれをYourTableと呼ぶべきだったと思います – Cato
どのdbmsを使用していますか? (答えはおそらく製品固有のものです。) – jarlh
私はTSQLを使用していますが、できるだけ汎用ソリューションを探していました。 – user5226582