次のスケルトンを持つ非常に長い SQL ステートメントがあります (SQL Server 2005 を使用)。
SELECT
a.something AS Something,
b.otherthing AS Otherthing,
(SELECT another FROM ... WHERE...) AS Importantvariable,
....
FROM...
INNER JOIN...
INNER JOIN...
WHERE a.columnname = (SELECT another FROM ... WHERE...) ....
これImportantvariable
自体が非常に長いクエリです。ただし、WHERE
句や句など、同じクエリの他の部分で使用されますINNER JOIN
。私の質問は、どうすればその値を保存して、毎回クエリ全体を書く必要がなくなるかです。上記の例a.columnname = Importantvariable
では、クエリ全体の代わりに入力したいと思います。DECLARE
宣言された変数で値を使用して保存しようとしましたが、次のエラーでそれを行うことができません。
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operation.
もちろん、それは理にかなっていますが、私の言いたいことはデータ検索を実行することですImportantvariable
. 何か案は?
を使用APPLY
して、名前付き変数row-wise のようなものを作成できます。値が 1 回計算され、セット全体で有効な場合 (定数のように)、CTE
( のWITH
前で始まる) を使用できますSELECT
。
以下では、APPLY
を使用して、すべての列のテーブル名を検索します。The.ImportantVariable
列リストおよびWHERE
-clause で使用できます。
SELECT The.ImportantVariable
,c.*
FROM sys.columns AS c
OUTER APPLY(SELECT name FROM sys.objects AS o WHERE c.object_id=o.object_id) AS The(ImportantVariable)
WHERE The.ImportantVariable LIKE 'a%';
これをチェックして!CTE によって提供される1 つの行にいくつかの定数値があり、クエリに組み込んで名前付き定数として使用できます。CROSS JOIN
WITH SomeConstants AS
(
SELECT 'I''m a constant value' AS Constant1 --might be a complex statement too!
,0 AS Constant2
)
SELECT The.ImportantVariable
,Constant1
,Constant2
,c.*
FROM SomeConstants
CROSS JOIN sys.columns AS c
OUTER APPLY(SELECT name FROM sys.objects AS o WHERE c.object_id=o.object_id) AS The(ImportantVariable)
WHERE The.ImportantVariable LIKE 'a%'
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加