あなたが説明したことは、非常に特定の理由で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
またはなぜそれを拒否する必要がありますか?
列がなく、テーブル内にある場合a
、b
OK、それは簡単です (循環参照が存在します: クエリを拒否します)。しかし、列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)