Oracle SQL で指定された列とすべてを選択することが間違っているのはなぜですか?
-
22-09-2019 - |
質問
次のような select ステートメントがあるとします。
select * from animals
これにより、テーブル内のすべての列のクエリ結果が得られます。
ここで、テーブルの 42 番目の列が animals
は is_parent
, 、直後にそれを結果で返したいと思います gender
, 、より簡単に見ることができます。ただし、他のすべての列も必要です。
select is_parent, * from animals
これは戻ります ORA-00936: missing expression
.
同じステートメントは Sybase でも正常に機能します。テーブル エイリアスを animals
機能させるためのテーブル ( select is_parent, a.* from animals ani
)、 しかし なぜ Oracle が選択を実行するにはテーブル エイリアスが必要ですか?
解決
実際には、元の問題を解決するのは簡単です。あなただけの*を修飾する必要があります。
select is_parent, animals.* from animals;
うまく動作するはずです。また、作業テーブル名のエイリアスます。
他のヒント
生産コードでこれを行うにはメリットがありません。私たちは、明示的ではなくSELECT *構文を使用するよりも、私たちが望むの列に名前を付ける必要があります。
SQL開発者、ヒキガエル、PL / SQLの開発、など - -アドホッククエリについては、自分でIDEを取得し、私たちは、SQLへの拡張を必要とせずに、クエリと結果セットを操作することを可能にします。
良い質問、私は多くの場合、これを自分自身を不思議に思っていましたが、その後それらのものの一つ...
としてそれを受け入れています同様の問題は、このです:
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;
これまで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歳のレガシーコードといくつかの歴史的な互換性のものになるかもしれません。
のためのもう一つの「なぜ買う!!!」 と一緒にバケツ、なぜあなたのことでグループをすることはできません別名の?
エイリアスのユースケース。*以下のようなフォーマットである
select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id
の参加に加え、他のテーブルからの(任意に)1つ以上の列でのテーブルからすべての列を選択すること、です。
あなたは二度同じ列を選択するためにそれを使用することができるという事実は、単に副作用です。そこ二度同じ列を選択するには本当のポイントはありませんし、私は怠惰は本物正当ではないと思います。
Select *
は、現実の世界で唯一の危険で検索した後ではなく名前でインデックス番号で列を参照するときに、大きな問題はないすべての列が結果セット(ネットワークトラフィック、CPUやメモリの負荷)に必要とされるとき、非効率です。
列xがテーブルに追加されている場合は、この例の場合のように、これらのテーブルが終わる時間が一致する名前を持つ列を有することができるよう、それは危険なことができます(他のテーブルから列を追加している場合はもちろん、その場合のselect *, x
は失敗します以前にそれを持っていなかったこと。
なぜ Oracle が選択を実行するにはテーブルの別名が必要である必要があります
Teradata も同様のことを必要としています。どちらもかなり古いので(そう呼んだ方が良いかもしれません) 成熟した :-) DBMS では、これは歴史的な理由かもしれません。
私のいつもの説明は次のとおりです。無資格の *
手段 すべて/すべての列 パーサー/オプティマイザーは単に混乱するだけです。 何よりも素晴らしいです.