The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  256  : 記事  1  : コメント  10248  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

例えば、

select hoge t from table1 where t = 1

といったように、列のエイリアスがwhere句で使えない。上記は、

select hoge t from table1 where hoge = 1

と書かなければならない。上の例では簡単なので列のエイリアスをwhere句で使えないことがあまり不便に感じられないかもしれない。しかし、以下のようにサブクエリを含んだ場合はとたんに冗長度が増す。実際にはテーブル名の前にスキーマ名も付くだろうし、サブクエリももっと複雑になるだろうから、さらに冗長度が増してしまう。

select (select table2age from table2 where table2id = table1id) table1age from table1
   where (select table2age from table2 where table2id = table1id) >= 20

本当は、以下のように書きたい。

select (select table2age from table2 where table2id = table1id) t_age from table1
   where t_age >= 20

なぜ、今でも列のエイリアスがwhere句で使えないのだろう? 一見すると簡単に思えるのだが、そんなに難しいのだろうか?

投稿日時 : 2008年1月25日 11:57

コメント

# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 12:05 囚人
ものすごく簡単に言うと「選択」→「射影」という順で実行されるためかと。
エイリアスバージョンだと、なんとなーく難しそうですね。

# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 12:09 trapemiya
上記の例はinner joinするSQL文に変更できますので、あんまりよくないかもしれませんね。実際に私がやっているのは、サブクエリである条件下でsumさせ、その結果を抽出条件に指定しているのです。

# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 12:14 trapemiya
>ものすごく簡単に言うと「選択」→「射影」という順で実行されるためかと。

データベースの仕組みを根底から理解していないので、ピンと来ません。(^^; 時間ができたら勉強してみます。ヒントをありがとうございます。

ただ、思うに、単にシンタックスシュガー的に処理してくれないかな~と思うわけです。つまり、where句にある列のエイリアスを本来のサブクエリに置き換えて処理してくれさえすればいいのに・・・と思ったりするわけです。

# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 12:14 ghost_shell
ぼくもプロシージャを使って加工した列に対してgroup byをかけたとき同じようなことを思いました。

# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 12:39 やじゅ
どうも、「射影」という言葉になじみがないので、
選択と射影って行列どっちだっけと悩んでします。

選択は行、射影は列

射影とは、同じ物を別々に違った見方で見る

# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 13:08 Streetw☆
select hoge + 1 as hoge from table1 where hoge = 1
だと混乱するかも。。


# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 13:41 THREE-ONE
sum(col) as total とか count(col) as cnt とかやって、条件指定したい場合はよく思います。

# re: SQL Server 2005でも列のエイリアスをwhere句に使えないんですね・・・ 2008/01/25 16:16 trapemiya
>>ghost_shellさん
>ぼくもプロシージャを使って加工した列に対してgroup byをかけたとき同じようなことを思いました。

そうなんです。group byもダメなんです。使えるのはorder byのみなんですよね。
select句
http://msdn2.microsoft.com/ja-jp/library/ms176104.aspx

>>やじゅ さん
>射影とは、同じ物を別々に違った見方で見る

なんか遠い昔に大学の数学で習ったような気がしないでもない・・・???
でも、かすかな記憶を呼び戻すことができました。

>>Streetw☆ さん
>select hoge + 1 as hoge from table1 where hoge = 1

なるほど。気付きませんでした。これだとwhere句で使うエイリアスには何らかの修飾が必要になりますね。もしくは、エイリアスには列名を使えないっていうことにするといいかな?
ん? そもそもエイリアスを列名と同じにできること自体がおかしんじゃないだろうか?

>>THREE-ONE さん
>sum(col) as total とか count(col) as cnt とかやって、条件指定したい場合はよく思います。

そうそう、正にこういう場合なんですよ。使いたいのは!


# [SQL Server]列別名の制限 2008/12/07 23:01 Not Only Result Ambition
フォーラムの回答 をしていて偶然知った個人的に意外に思ったことをメモしておきます。 列別名は、列名をその名の通り別の名前をつけてしまうものです。使い方は簡単! SELECT id ,FamilyName

Post Feedback

タイトル
名前
Url:
コメント