6

私はmysqlに膨大な行数のテーブルを持っています(私は一般的なSQLソリューションを探していますが)

very_big_table(INT a, INT b, INT c, ...)

SELECTステートメントが欲しかった

SELECT a, 
    (b + c) as expression1,
    (b + c + a) AS expression2 -- basically (expression1 + a)
FROM very_big_table
WHERE ...
GROUP BY a
ORDER BY a DESC

これは、expression1が単純である限り、見栄えがよく、読みやすくなっています。
ただし、CASE-WHEN / IFNULL()/ SUM()/ MIN()/ STRCAT()または一部の演算子がこれらの式で使用されると、読み取りとデバッグが困難になります。


mysql値を変数インラインに割り当てるすでに尋ねられた質問のいくつかを通過し
ました別の列(SQLServer)の列の値を使用しますか?
同じselectステートメントで条件付き列の値を使用するにはどうすればよいですか?

しかし、私が次のようなアプローチを使用する場合

SELECT a, 
    expression1,
    (expression1 + a) AS expression2
FROM 
    (SELECT a,
        (b + c) AS expression1
    FROM very_big_table
    WHERE ...
    GROUP BY a) as inner_table
ORDER BY a DESC

これは正常に機能しますが、このクエリの実行には70倍の時間がかかります。少なくとも一度だけですが、私がそれを発射したとき。出力列に
複数のレベルの式がある場合はどうなりますか?

読みやすさを損なうことなく、これに対処するためのエレガントな方法はありますか?

ところで、SQL標準またはベンダーでサポートされていないselectステートメントでのこの式の再利用またはエイリアス参照がないのはなぜですか?(単一のSELECTステートメント式に循環評価がない場合。その場合、コンパイラーは失敗します)

4

4 に答える 4

7

ユーザー定義変数を使用して問題を解決できます。SQL は次のように書き換えることができます。

SELECT a, 
    @expr1 := (b + c) as expression1,
    (@expr1 + a) AS expression2
FROM very_big_table
WHERE ...
GROUP BY a
ORDER BY a DESC

この投稿を参照できます。

于 2016-06-30T06:57:05.173 に答える
2

それには2つの選択肢があります..

実際のクエリをサブクエリとして使用する

 select a,exp1,exp1+a as exp2
 from (SELECT a 
             ,(b + c) as exp1
       FROM very_big_table
       WHERE ...
       GROUP BY a
 )V
 ORDER BY a DESC

または、クエリに外側の適用ステートメントを追加します...

SELECT a 
      ,OA.exp1 as expression1
      ,(OA.exp1 + a) AS expression2 -- basically (expression1 + a)
FROM very_big_table
outer apply (select (b + c) as exp1) OA
WHERE ...
GROUP BY a
ORDER BY a DESC

外部適用を使用する2番目のオプションは、読み取りに適していると思います...

Outer apply は行ごとに実行されることに注意してください

したがって、exp1がテーブルから大量のデータにアクセスする必要がある場合は、悪い考えかもしれません..

とにかく、実際のクエリで既に取得しているフィールドを使用するだけで、それを追加しても大きなコストはかかりません。

だから..あなたはどの方法を選びますか?

于 2013-01-23T19:20:17.460 に答える
0

式が sql select サブ句ではなく、元の「select from」句で取得されたデータに純粋に作用するネストされた演算子/関数であると想定する回避策。ユーザー定義関数を作成する

次に、クエリは次のようになります

select a
, myfunction( b, c)
, myfunction( b, c) + a
...

利点-これにより、指定された目標であった「選択コード」がクリーンアップされ、より複雑なロジックを一元的に管理できます

欠点 - これは他のシステムに移植される「一般的な sql」ではなく、関数がめったに再利用されない場合、時間の投資に値しない可能性があります。

于 2012-11-17T17:19:51.883 に答える