27

私は行くselectステートメントを持っているとしましょう..

select * from animals

これにより、テーブル内のすべての列のクエリ結果が得られます。

ここで、表の 42 列目がanimalsis_parent、結果の の直後にそれを返したいgender場合、より簡単に確認できるようになります。しかし、他のすべての列も必要です。

select is_parent, * from animals

これは を返しますORA-00936: missing expression

Sybase では同じステートメントが正常に機能し、テーブルを機能させるにはテーブル エイリアスをテーブルに追加する必要があることはわかっていますanimals( select is_parent, a.* from animals ani) 。

4

7 に答える 7

30

実際、元の問題を解決するのは簡単です。* を修飾するだけです。

select is_parent, animals.* from animals;

うまくいくはずです。テーブル名のエイリアスも機能します。

于 2010-02-23T16:09:11.907 に答える
2

select *なぜ使用すべきでないのかについてのこれまでのところ多くの良い答えがあり、それらはすべて完全に正しいです。ただし、特定の構文が失敗する理由に関する元の質問に答えるものはないと思います。

悲しいことに、その理由は...「そうではないから」だと思います。

シングルテーブルクエリとマルチテーブルクエリの違いは何もないと思います。

これは正常に機能します。

select *
from
    person p inner join user u on u.person_id = p.person_id

しかし、これは失敗します:

select p.person_id, *
from
    person p inner join user u on u.person_id = p.person_id

これが機能している間:

select p.person_id, p.*, u.*
from
    person p inner join user u on u.person_id = p.person_id

これは、20年前のレガシーコードとの歴史的な互換性の問題かもしれません。

「なぜ買うのか!!!」のもう一つ バケット、およびエイリアスでグループ化できないのはなぜですか?

于 2010-02-23T14:20:51.187 に答える
2

本番コードでこれを行うメリットはありません。SELECT * コンストラクトを使用するのではなく、必要な列に明示的に名前を付ける必要があります。

アドホック クエリについては、IDE (SQL Developer、TOAD、PL/SQL Developer など) を入手してください。これにより、SQL の拡張を必要とせずにクエリと結果セットを操作できます。

于 2010-02-23T04:07:06.077 に答える
2

良い質問です。私はよくこれを自分で疑問に思っていましたが、それらの1つとして受け入れました...

同様の問題はこれです:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier

ここで、geometrie は mdsys.sdo_geometry 型の列です。

エイリアスを追加すると、機能します。

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a;
于 2010-02-23T14:25:16.450 に答える
1

Select *実世界では、名前ではなく検索後にインデックス番号で列を参照する場合にのみ危険です。より大きな問題は、結果セットですべての列が必要とされない場合 (ネットワーク トラフィック、CPU、およびメモリ負荷) の非効率性です。もちろん、他のテーブルから列を追加する場合 (この例の場合のように、これらのテーブルには時間の経過とともに名前が一致する列が含まれる可能性があるため、危険な場合がありますselect *, x。その場合、列 x がテーブルに追加されると失敗します。以前はありませんでした。

于 2010-02-23T08:11:51.587 に答える
1

alias.* 形式の使用例は次のとおりです。

select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id

つまり、結合内の 1 つのテーブルからすべての列を選択し、さらに (オプションで) 他のテーブルから 1 つ以上の列を選択します。

これを使用して同じ列を 2 回選択できるという事実は、単なる副作用です。同じ列を 2 回選択しても意味がなく、怠惰が正当化されるとは思いません。

于 2010-02-23T03:13:51.947 に答える