2016-08-04 3 views
0

に応じて複数回、私はこの形式のテーブルを持っていると言うことができますそれぞれの行を選択します。SQLは、行の値

ID value 
1 2 
2 1 
3 4 

各行にvalue回を選択する最も効率的方法は何ですか?

クエリの所望の出力を使用すると、数字のテーブルを持っている場合は、あなたが行うことができます

ID 
1 
1 
2 
3 
3 
3 
3 
+0

どのdbmsを使用していますか? (答えはおそらく製品固有のものです。) – jarlh

+0

私はTSQLを使用していますが、できるだけ汎用ソリューションを探していました。 – user5226582

答えて

2

です:

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; 
1

..

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 
1
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)   
+0

「vTable」とは何ですか? –

+0

@Bogdan Bogdanov - それは私がIDと価値のあるテーブルを呼び出したものです - 私はそれをYourTableと呼ぶべきだったと思います – Cato

関連する問題