それを2つの操作に分けてみませんか?それらを1つのステートメントにまとめようとすると、何が得られると思いますか?
SELECT @Type = (subquery);
SELECT CASE WHEN @type = 'Consumer'...
鈍感に聞こえるリスクがありますが、本当に変数が必要ですか?なぜだめですか:
SELECT CASE WHEN col_form_subquery = 'Consumer' THEN ...
END Product
FROM (<subquery>) AS x;
そのフォームでは、変数に値を割り当てるか、結果を取得するかを決定する必要があります。
複数の変数をプルすることもできます。
SELECT @Col1 = Col1, @Col2 = Col2
FROM (<subquery>) AS x;
-- then refer to those variables in your other query:
SELECT *, @Col1, @Col2 FROM dbo.Products WHERE Col1 = @Col2;
しかし、あなたは十分な詳細を共有していないので、これはすべて推測です。
さて、編集しました。実際のクエリがあり、あなたが何を求めているのかをもう少しよく理解できるようになったので、新しいバージョンを作成できるかどうかを見てみましょう。クエリ内で再利用できるように@Type変数を格納しようとしているだけであり、後で(このクエリの後で)使用するためにそこに値を格納しようとしていないと仮定します。
SELECT CASE
WHEN c.CustomerType = 'Company' THEN p.BusinessName
WHEN COALESCE(c.CustomerType, '') IN ('Consumer', '') THEN p.FriendlyName
END
--, other columns
FROM dbo.Products AS p
INNER JOIN dbo.Category AS cat
ON p.CatId = cat.CatId
INNER JOIN dbo.CustomerCategories AS ccat
ON ccat.CatId = cat.CatId
INNER JOIN dbo.Customers AS c
ON c.CustomerId = ccat.CustomerId
WHERE cat.CategoryId = @CatId;
いくつかのメモ:
- サブクエリがこれにアプローチする正しい方法であるとあなたが考えた理由はわかりません。通常、メインクエリからほとんど独立してスマートになり、個々のサブクエリを最適化するのではなく、適切な結合を構築してSQL Serverにクエリ全体を最適化させる方が、はるかに優れています(他の開発者にとってはより明確です)。適切な結合は、サブクエリを介して、潜在的に具体化される可能性のある行を前もって排除するのに役立ちます-破棄されるだけです。SQL Serverを信頼してその仕事をしてください。この場合、その仕事は複数のテーブル間で結合を実行することです。
- SELECTでカテゴリ名を表示する必要がない場合は、dbo.Categoryへの結合は必要ない場合があります。その場合は、where句を変更し、その結合を削除します(代わりにCusomterCategoriesに結合します)。
- 考えられるすべてのシナリオをカバーした場合、2番目のケースは単純なELSEに変更できます。
- 製品とカテゴリの結合について仮定しました(カテゴリが他のカテゴリのように複数形ではないのはなぜですか?)。そうでない場合は、ご記入ください。