1

これは説明が難しいでしょうが、ここにあります。

SELECT2 つの計算の結果を使用して、列の値に対してどの計算値を返すかを決定する句で、CASE 条件を実行しようとしています。

コードサンプルが役立つかもしれません:

これは機能します:

SELECT 
   A.[COLUMN1]
   , B.[COLUMN1]
   , CASE 
      WHEN A.[COLUMN2] + A.[COLUMN3] >= B.[COLUMN2] + B.[COLUMN3] THEN A.[COLUMN2] + A.[COLUMN3]
      ELSE B.[COLUMN2] + B.[COLUMN3]
FROM
   [TABLE_A] A
      INNER JOIN [TABLE_B] B INNER JOIN ON A.ID = B.ID

ここでの問題は、上記のクエリの case ステートメントで、計算を 2 回実行する必要があることです。節に対して 1 回、WHEN節に対してもう一度THEN

私はこのようなことをしたいのですが、SQL はそれに満足していません。

SELECT 
   A.[COLUMN1]
   , B.[COLUMN1]
   , CASE 
      WHEN AB.X >= AB.Y THEN AB.X
      ELSE AB.Y
     END
     FROM ((A.[COLUMN2] + A.[COLUMN3]) X, (B.[COLUMN2] + B.[COLUMN3]) Y)
FROM
   [TABLE_A] A
      INNER JOIN [TABLE_B] B INNER JOIN ON A.ID = B.ID

これは可能ですか?2 番目の例では、値を 1 回だけ計算し、case ステートメントでWHEN、節とTHEN節の両方で値を参照しています。

4

2 に答える 2

1

計算を各テーブルにプッシュすることをお勧めします。これにより、クエリの構造が非常に似たものになります。したがって、構文的に正しい (またはほぼ正しい) バージョンは次のようになります。

SELECT A.[COLUMN1], B.[COLUMN1],
       (CASE WHEN a.col_2_3 >= b.col_2_3 THEN a.col_2_3
             ELSE b.col_2_3
        end)
FROM (select a.*,  (A.[COLUMN2] + A.[COLUMN3]) as col_2_3
      from [TABLE_A] a
     ) a INNER JOIN
     (select b.*, (B.[COLUMN2] + B.[COLUMN3]) as col_2_3
      from [TABLE_B] b
     )b
     ON a.ID = b.ID

パフォーマンスには非常に多くの重要な要素があり、単純な計算のオーバーヘッドはその 1 つではありません。データの読み取りと結合は、単純な計算よりもはるかにコストがかかります。

ただし、変数をサブクエリに移動すると、いくつかの理由で便利です。まず、計算のコストが高くなる可能性があります (サブクエリを使用するなど)。また、読みやすさと保守性にも役立ちます。

最後に、SQL エンジンは、これらの式を 1 回だけ評価することを決定できます。実際には、そのような些細な最適化を行う人はいないと思います。

于 2013-02-07T22:46:07.077 に答える
1

このように再定式化できます

SELECT a_column1, 
       b_column1, 
       CASE 
         WHEN x >= y THEN x 
         ELSE y 
       END AS foo 
FROM   (SELECT A.[column1]                   A_COLUMN1, 
               B.[column1]                   B_COLUMN1, 
               ( A.[column2] + A.[column3] ) X, 
               ( B.[column2] + B.[column3] ) Y 
        FROM   [table_a] A 
               INNER JOIN [table_b] B 
                       ON A.id = B.id)t 

しかし、とにかく操作は行ごとに1回実行される可能性があるため、違いが生じるかどうかはわかりません

于 2013-02-07T22:39:37.037 に答える