特定のテーブルに膨大な数の選択肢があるとしましょう。列の1つの値は、複素数logcを使用して計算され、ColumnAと呼ばれます。ここで、別の列について、ColumnAの値が必要であり、それに他の静的な値を追加します。
サンプルSQL:
select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...
[ColumnA] + 1は私が探しているものです。複雑なものは巨大なケース/ブロック時です。
アイデア?
SELECT
句で計算された値を参照する場合は、既存のクエリをサブSELECTに移動する必要があります。
SELECT
/* Other columns */,
ColumnA,
ColumnA + 10 as ColumnB
FROM
(select table.id, table.number, complex stuff [ColumnA].. from table ...
) t
使用しない場合でも、このテーブルのエイリアスを導入する必要があります(上記のt
、閉じ括弧の後に)。
(同等に-SQL Server 2005以降を使用していると仮定すると-既存のクエリをCTEに移動できます):
;WITH PartialResults as (
select table.id, table.number, complex stuff [ColumnA].. from table ...
)
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults
複数レベルの部分計算が実行されている場合、CTEはよりクリーンに見える傾向があります。クエリに含めるColumnBに依存する計算がある場合。
残念ながら、SQL Server2016では次のようになります。
SELECT 3 AS a, 6/a AS b;
エラー:無効な列名: 'a'。
これはサブクエリと列エイリアスで解決できます。
次に例を示します。
SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
FROM SomeTable t) As SomeTableMaxId
あなたは出来る:
+ 10
を実行しますcomplex stuff
のロジックをカプセル化するスカラー値関数を記述します。単一の呼び出しに最適化されます。complex stuff
ロジックをコピーします。 1回の呼び出しに最適化する必要があります。