2

現在構築しているテーブルに対して、MySQL に何らかのデフォルト エイリアスがあるかどうか疑問に思っていました (SmallTalk の「self」や Java の「this」など)。例えば:

SELECT 
SUM(revenue) AS revenue,
SUM(units) AS units,
SUM(revenue)/SUM(units) AS revPerUnit,
-- I want to replace the above line with the below line:
self.revenue/self.units AS revPerUnit2
FROM inputTable;

あいまいなエイリアスを使用できることはわかっていますが、あいまいな定義が存在する場合に現在のテーブルのエイリアスが必要であることを指定する方法があるかどうかを知りたいです。

4

2 に答える 2

3

通常、これは私がこれらの場合に行うことです:

SELECT revenue, 
       units, 
       revenue / units AS revperunit2 
FROM   (SELECT SUM(revenue) AS revenue, 
               SUM(units)   AS units 
        FROM   inputtable) subsel 

複雑なクエリがあり、フィールドを再宣言することは読みやすさにもパフォーマンスにも良くない場合があります。サブクエリは行く方法です。

于 2011-10-05T19:27:55.287 に答える
1

あなたが説明したことは、非常に特定の理由でSQLでは不可能です。リストではSELECT、すべての列が同時に計算 (作成、解決) されるか、あたかも同時に計算 (作成、解決) されたかのようになります。つまり、どのような順序で計算しても同じ結果が得られます。

つまり、別の列の計算で列のエイリアスを使用 (参照) することはできません。

あなたが説明したことが可能であれば、次のタイプの循環参照を持つことができます。

SELECT SUM(a)*sb AS sa
     , SUM(b)*sa AS sb 
FROM aTable

もちろん、エラーとして拒否する必要があります。そして、循環参照をチェックするクエリパーサーにレベルを追加することで、それはかなり簡単になります(循環参照が存在します:クエリを拒否します)

しかし、この結果をどのように計算する必要がありますか:

SELECT SUM(a) AS b
     , SUM(b) AS a
FROM aTable

またはなぜそれを拒否する必要がありますか?

列がなく、テーブル内にある場合abOK、それは簡単です (循環参照が存在します: クエリを拒否します)。しかし、列aとがある場合b、それは循環参照ですか? あいまいな参照bにありますか? SUM(b)bまたはエイリアスを参照していますbか?


ちなみに、2 つ目は有効な SQL クエリです。SQL はすべての計算が完了したと想定し (SUM(a)そしてSUM(b)ここで)、エイリアスが結果に割り当てられるためです。それは同じです:

UPDATE aTable
SET a=b
  , b=a

実際には、2 つの列のデータを交換します。このように書くと、実際に試してみないとわかりません。バックグラウンドで何が起こっているかをよりよく理解するための別のより良い方法があります (まだすべての RDBMS がこれをサポートしているわけではありません)。

UPDATE aTable
SET (a,b)=(b,a)
于 2011-10-05T20:36:56.437 に答える