2016-07-05 4 views
0

は私がSQL:自己組合にどのように任意の時間

Name Value 
Cat 10 
Dog 15 

のようなテーブルは、今すぐ値0を持つ新しい列を作成することによって、入力パラメータ「N」、自己組合テーブル「N」回を与えていると仮定します各原点行に対してN-1に設定する。 Nが2である場合たとえば、結果テーブルには、「N」は4である場合、結果として得られるテーブルがかかるSQL Server用のSQL文を書くための方法

Name Value Count 
Cat 10  0 
Cat 10  1 
Cat 10  2 
Cat 10  3 
Dog 15  0 
Dog 15  1 
Dog 15  2 
Dog 15  3 

でなければなりません

Name Value Count 
Cat 10  0 
Cat 10  1 
Dog 15  0 
Dog 15  1 

する必要があります上記のようにテーブルを作成するには、入力パラメータ "N"を使用しますか?それを行うには

おかげ

+1

使用されているdbmsにタグを付けてください –

+1

あなたが使用しているRDBMSとバージョンを言い始めることができます。 MySQL?、SQL Server?、Oracle?、POstgresql?.... – Lamak

答えて

1

一つの方法は、再帰CTEを使用して数値を生成し、クロス結合を実行されます。

declare @n int = 5; 
with nums(n) as (select 0 
       union all 
       select n+1 from nums where n < @n-1) 
select t.*,num.n 
from tablname t 
cross join nums num 
3

連合は間違った言葉ですが、CROSS JOINは必要なものです。

ほとんどのプラットフォームでは、再帰的なCTEとクロス結合でこれを行うことができます。

WITH numberList as 
(
    SELECT <input number here> AS NUM 
    UNION ALL 
    SELECT NUM-1 
    FROM numberList 
    WHERE NUM-1 >= 0 
) 
SELECT t.name, t.value, numberList.num 
FROM tablename, numberList 

numが大きい(たとえば10kを超える)と予想される場合は、このようにしないでください。代わりに(ほとんどのプラットフォームで)、生成された索引/シーケンスを使用して一時表を作成する必要があります。

関連する問題