web-dev-qa-db-ja.com

クエリでエイリアスを使用して使用する

SQLのエイリアスに関して疑問と質問があります。同じクエリでエイリアスを使用したい場合は、それを使用できますか。例:列aとbを持つテーブル名xyzについて考えてみます。

select (a/b) as temp , temp/5 from xyz

これは何らかの方法で可能ですか?

18
asb

クエリ内の式に識別子を指定し、クエリの他の部分でその識別子を再利用することについて話しているのですか?

これは、私のSQLエクスペリエンスのほぼすべてが制限されているMicrosoft SQLServerでは不可能です。ただし、次のことはできます。

SELECT temp, temp / 5
FROM (
    SELECT (a/b) AS temp
    FROM xyz
) AS T1

明らかに、その例は特に有用ではありませんが、複数の場所で式を使用している場合は、より有用な場合があります。式が長く、それらをグループ化する場合にも便利です。GROUPBY句では、式を再記述する必要があるためです。

MSSQLでは、クエリではなくテーブルスキーマで指定される計算列を作成するオプションもあります。

14
Josh

Oracle withステートメントも使用できます。他のDBでも同様のステートメントを利用できます。これが私たちがOracleに使用しているものです。

with t
as (select a/b as temp
from xyz)
select temp, temp/5
from t
/

WITHステートメント は1回だけ評価され、後続のステートメントで使用されるため、これには、特に複数のネストされたクエリを含む複雑なクエリがある場合に、パフォーマンス上の利点があります。

5
Guru

SQL製品がエントリーレベルの標準SQL-92に準拠していると仮定すると、同じSELECT句では不可能です。

SELECT句の式(およびそれらの相関名)は、「一度に」存在します。あなたが望んでいるように見える左から右への評価はありません。

ここでの@JoshEinsteinの回答によると、回避策として派生テーブルを使用できます(できれば、「temp」よりも意味のあるモート名を使用し、temp/5式に名前を付けてください。継承する人を念頭に置いてください。コード)。

投稿したコードはMSAccessデータベースエンジンで機能しますが(2番目の式にExpr1などの意味のない相関名を割り当てます)、実際のSQL製品ではないことに注意してください。

2
onedaywhen

その可能性は私が推測します:

SELECT (A/B) as temp, (temp/5)
FROM xyz, 
(SELECT numerator_field as A, Denominator_field as B FROM xyz), 
(SELECT (numerator_field/denominator_field) as temp FROM xyz);
1
Chris

これはAmazonRedshiftで利用できるようになりました

例えば。

select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;

参照:

https://aws.Amazon.com/about-aws/whats-new/2018/08/Amazon-redshift-announces-support-for-lateral-column-alias-reference/

0
Jebil