SQLクエリ構文:カウントでテーブルエイリアスを使用することは無効ですか?なんで?
質問
誰かが私に、なぜ次のクエリが無効であるのかを説明してもらえますか? 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(*)は、外側の結合が情報が不足しているテーブルのヌル行を作成しているため、ここでは良くありません。