SQLクエリ構文:カウントでテーブルエイリアスを使用することは無効ですか?なんで?

StackOverflow https://stackoverflow.com/questions/2906017

質問

誰かが私に、なぜ次のクエリが無効であるのかを説明してもらえますか? Oracle 10Gデータベースに対してこのクエリを実行しています。

select count(test.*) from my_table test;

次のエラーが発生します:ORA-01747:Invalid user.table.column、table.column、または列の仕様

でも, 、次の2つのクエリが有効です。

select count(test.column) from my_table test;

select test.* from my_table test;
役に立ちましたか?

解決

COUNT(expression) すべての行をカウントします expression ヌルではありません。 COUNT(*) 例外ですが、行数を返します。 * のエイリアスではありません my_table.*.

他のヒント

私の知る限りでは、 Count(Table.*) SQL仕様では正式にサポートされていません。それだけ Count(*) (返されたすべての行をカウント) Count(Table.ColumnName) (指定された列のすべての非ヌル値をカウントします)。だから、たとえDBMがそれをサポートしたとしても、私はそれを使用することをお勧めします。

この構文は機能します PostgreSQL そして、それが記録的なデータ型を持っているからです(それのために test.* 意味のある表現です)。

使用するだけです COUNT(*).

このクエリ:

select count(test.column) from my_table test;

その記録の数を返します test.column ではありません NULL.

このクエリ:

select test.* from my_table test;

からすべてのレコードを返します my_table.

COUNT そのため、おそらくパラメーターなしで意味のある唯一の集合体であり、次のような式を使用する COUNT(*) 実際のパラメーターを提供せずに関数を呼び出す方法にすぎません。

外側の結合を行っている場合、test.columnがnullではないレコードの数を合理的に見つけたいかもしれません。すべてのテーブルにはPK(nullではない)が必要なので、必要に応じてそのような行を数えることができるはずです。

select count(y.pk)
from x
left outer join y on y.pk = x.ck

count(*)は、外側の結合が情報が不足しているテーブルのヌル行を作成しているため、ここでは良くありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top