私はN列のテーブルを持っています。 c1
、c2
、c3
、c4
、... cN
としましょう。複数の行の中で、[1、N]の各Xに対してCOUNT DISTINCT(cX)
という単一の行を取得したいとします。列を一覧表示せずに、すべての列で同じ集計を実行する方法は?
すべての列名をクエリに手動で書き込まずに(ストアドプロシージャ内で)実行できる方法はありますか?
なぜですか?
アプリケーションサーバーのバグが、あとで挿入されるガベージを使用して適切な列の値を書き直すという問題がありました。これを解決するために、私は情報ログ構造を保存しています。各行は論理的なUPDATE
クエリを表します。次に、レコードが完成したという信号が与えられると、私は、値が(誤って)上書きされたかどうかを判断できます。
複数の行で1つの正しいレコードの例:各列に最大で1つの値があります。
| id | initialize_time | start_time | end_time |
| 1 | 12:00am | NULL | NULL |
| 1 | 12:00am | 1:00pm | NULL |
| 1 | 12:00am | NULL | 2:00pm |
Reconciled row:
| 1 | 12:00am | 1:00pm | 2:00pm |
私が検出したい相容れないレコードの例:
| id | initialize_time | start_time | end_time |
| 1 | 12:00am | NULL | NULL |
| 1 | 12:00am | 1:00pm | NULL |
| 1 | 9:00am | 1:00pm | 2:00pm | -- New initialize time => irreconcilable!
列名を取得する方法、または集計を行う方法を尋ねていますか? –
私は列名をフェッチする方法を知っていますが、クエリの各列名の周りの式を展開する方法はわかりません。 私のストアドプロシージャでDISTINCT(c1)、COUNT DISTINCT(c2)、...、COUNT DISTINCT(cN)FROM ... 'を避けたいです。 –
これはもちろん、動的SQLで行うことができます。ちなみに、Xはどれくらい大きいですか? – dezso