2010-12-02 9 views
0

を選択する私は、セット内の次の使用可能な数見つける必要があります。SQLピボットテーブル:次の使用可能な数

select min([pivot]) 
from [pivot] 
where not exists (
     select null as nothing 
     from product 
     where product.id = [pivot].[pivot]) 

しかし、このアプリは非常に長い時間のために使用され、[ピボット]フィールドは整数です。私は実際に2,147,483,647 [ピボット]レコード(0から大きな数字までの連続した数字をテーブルに作成する)を作成したくありません。ビューの作成には時間がかかります。

実際には作成しないで[ピボット]テーブルを提供できるT-SQL(Microsoft SQL Server 2005/2008)の機能がありますか? [ピボット]ビューを作成するのは、ビューにアクセスするのに時間がかかるため、作成できません。

+0

存在しない分(product.id)を探していますか?だから、もしあなたが1,3,4を持っていれば、それは2を返すことになりますか? – Beth

答えて

3

このようなものが役立つかどうかを確認してください。私の例では#Testには返されるべき穴が5つあります。#Test2には穴がないので、新しいIDが返されることを期待しています。それは自己結合によって成り立っています。どうしてピボットがあるのか​​わからないので、あなたの問題を誤解しているかもしれません。

CREATE TABLE #test 
(
    num int 
) 

CREATE TABLE #test2 
(
    num int 
) 

INSERT INTO #test (num) 
SELECT 1 UNION ALL 
SELECT 2 UNION ALL 
SELECT 3 UNION ALL 
SELECT 4 UNION ALL 
SELECT 6 UNION ALL 
SELECT 7 

INSERT INTO #test2 (num) 
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 

SELECT MIN(t1.num)+1 FROM #test t1 
    LEFT JOIN #test t2 ON t1.num+1 = t2.num 
    WHERE t2.num IS NULL 

SELECT MIN(t1.num)+1 FROM #test2 t1 
    LEFT JOIN #test2 t2 ON t1.num+1 = t2.num 
    WHERE t2.num IS NULL 
+0

私はSQLを修正しました。 20億レコードテーブルを作成せずにピボットテーブルを機能させる方法を探しています。 –

+1

あなたが探しているテーブルで無料で持っているIDのセットに参加するのはどうですか? 21億レコードのテーブルを無料で作成することはできません。 –

+0

良い答え。それはうまくいった。私は範囲を持つためにいくつかのものを追加し、セットが空の場合は常に値を提供します。 –

0
select min([pivot]) + 1 as next_num 

+0

私はSQLを修正しました。 20億レコードテーブルを作成せずにピボットテーブルを機能させる方法を探しています。 –

1

これはそれを行うための最善のの方法である場合、私はわからないんだけど、それは自動的にテーブルを作成する方法について主な質問に答える:

WITH myValueTable AS (
    SELECT 1 AS 'val' 
    UNION ALL 
    SELECT val + 1 FROM myValueTable WHERE val < 1000 
) 
SELECT * FROM myValueTable OPTION (MAXRECURSION 1000) 

...戻ります1から1000の値を持つ単一の列テーブルです。ただし、これを定期的に実行する場合は、(クエリ全体で)静的なテーブルを作成する方が速くなります。値を特定の範囲に固定することができます(たとえば124から始まり次の10を生成するなど)。

しかし、このクエリについて詳しく知りませんが、これが当面の最善の解決策であるかどうかは分かりません。あなたが持っているものと出ようとしているもののサンプルデータを提供できれば、それは役に立ちます。

編集... あなたは数字のセットの中の「ギャップ」を見つけようとしている場合、あなたは試みることができる:

WITH mycte AS (
    SELECT product.id, ROW_NUMBER() OVER (ORDER BY product.id) AS 'rownum' FROM product 
    UNION 
    SELECT MAX(product.id), MAX(product.id) + 1 FROM product 
) 
SELECT MIN(rownum) FROM mycte WHERE rownum <> id 

...再びパフォーマンスを保証することはできませんしかし、あなたに遊ぶアイデアを与えるかもしれません。

+0

これはとても面白いです。はい、私は、ピボットテーブルを生成せずにそれを発見する時間をゼロにすることなく、次に利用可能な最も未使用の番号を探しています。 –

関連する問題