この便利な機能を参照してください。多くのDBAは、自分が管理しているどのシステムにもタリー表が存在することを常に望んでいる)
I ju先日私がオンラインで見た非再帰CTEベースの「集計表」ソリューションを共有したいと思っていました。データベースの依存関係がなくても巨大な範囲(4億文字の論理行)と一般的なアプリケーションで驚くほどエレガントだと思います。
WITH
E00(N) AS (SELECT 1 UNION ALL SELECT 1),
E02(N) AS (SELECT 1 FROM E00 a, E00 b),
E04(N) AS (SELECT 1 FROM E02 a, E02 b),
E08(N) AS (SELECT 1 FROM E04 a, E04 b),
E16(N) AS (SELECT 1 FROM E08 a, E08 b),
E32(N) AS (SELECT 1 FROM E16 a, E16 b),
cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
SELECT *
FROM cteTally
WHERE N >= 2500
AND N <= 2700
AND N % 10 = 0
hereが見つかりましたが、それがこのCTEの元のソースかどうかはわかりません。
分かりやすい点は、最小、最大、またはステップサイズを気にする必要がなく、ほとんどの(1回限りの)状況で非常にうまくいくことです。つまり、頻繁に呼び出されるビジネスプロセスでは使用しないでください。物理的なインデックス番号のテーブルは、常により優れたパフォーマンスを発揮します。
EDIT:このメソッドのソースについてもう少し調べました(私が参照した記事のstackoverflowリンクを見逃していました)。それは当初、Itzik Ben-Ganに起因していました。 「Inside Microsoft SQL Server 2005 - T-SQL Querying」(says Jeff Moden、私が暗黙のうちに信頼する人)の本です。
出典
2011-12-21 08:18:37
Tao
Jeff Modenについて話をすると、再帰的なCTEがおそらくこのタイプの問題の良い解決策にはならない理由を説明した回答があります:http://stackoverflow.com/questions/10819/sql-auxiliary-table-of-numbersしかし、やはり、最高のパフォーマンスを発揮するソリューションは、常に物理数値テーブルを使用することです) – Tao