0

次のT-SQLステートメントを有効にするにはどうすればよいですか?すべてのCASEオプションに@Type変数を設定するサブクエリをコピーできますが、サブクエリを1回だけ実行したいと思います。出来ますか?

SELECT
      @Type = (SELECT CustomerType FROM dbo.Customers WHERE CustomerId = (SELECT CustomerId FROM dbo.CustomerCategories WHERE CatId= @CatId)),
      CASE
         WHEN @Type = 'Consumer'THEN dbo.Products.FriendlyName
         WHEN @Type = 'Company' THEN dbo.Products.BusinessName
         WHEN @Type IS NULL THEN dbo.Products.FriendlyName
         WHEN @Type = '' THEN dbo.Products.FriendlyName
      END Product,
      ...
FROM
      Products
INNER JOIN
      Category
...

編集:私の例をより具体的に変更しました...今すぐ実行する必要があります...明日戻ってきます...サインオフして申し訳ありませんが、子供を迎えに行く必要があります:Dは明日チェックします。THX!!

明確化:2つを分離することはできません:サブクエリのwhere-clasueで、メインクエリの結合stmtで使用されているテーブルの列を参照する必要があります。それらを分離すると、@Typeの関連性が失われます。

4

2 に答える 2

4

それを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に変更できます。
  • 製品とカテゴリの結合について仮定しました(カテゴリが他のカテゴリのように複数形ではないのはなぜですか?)。そうでない場合は、ご記入ください。
于 2012-04-24T19:42:15.883 に答える
4

それはできません。次のエラーが発生します

変数に値を割り当てるSELECTステートメントは、データ取得操作と組み合わせてはなりません。

2つを分離してから、selectステートメントの一部として変数を返します

于 2012-04-24T19:42:15.977 に答える