2009-12-01 20 views
13

count(distinct *)をSQLで使用できないのはなぜですか?すべての個別の行を数えますか?SQLカウント(*)と別名

+0

「個別の行」とはどういう意味ですか? –

+0

行全体に重複している行がありますか、それは見つけようとしていますか? –

+0

今私はそれを考えると、テーブルが正規化されているので、まったく同じ行がないので、その無駄な権利がありますか?これは理由ですか? –

答えて

27
select count(*) from (select distinct * from MyTable) as T 

私は強くあなたは再考えることDISTINCTを使用するすべてのクエリを示唆しているが。大部分のケースでは、GROUP BYがより適切(かつ高速)です。

EDIT:は質問のコメントを読んでたので、私は実際に結果を得るためにやって必要以上にあなたが決してがより多くの仕事をするためにDBMSを依頼する必要があることを指摘しなければなりません。テーブルに重複する行がないことを事前に知っている場合は、DISTINCTを使用しないでください。

+0

@Christian - こんにちは、それは前にそのように見たことはありません。好奇心のために私の最後のテーブルにそれを走らせました。 ms SQLサーバーで作業しますか?注 - 括弧内の選択は完全に実行されます – Kamal

+2

OracleではDISTINCTはGROUP BYを使用して実装されているため、DISTINCTとGROUP BYは同じ実行計画を持ちます。だから違いはないはずです。 –

+0

@Kamal:申し訳ありませんが、SQL Serverがネストされたクエリを使用しているかどうか分かりません。エイリアス名を末尾に追加すると( 'as T')問題が解決されました。 –

1

本当にできます。

識別子がある場合は、全く異なる行はありません。しかし、あなたは、インスタンスのために行うことができます:

SELECT COUNT(DISTINCT SenderID) FROM Messages 
9

あなたは...によって

SELECT column1, column2, column3, count(*) 
FROM someTable 
GROUP BY column1, column2, column3 
+0

これは実際に質問が何を求めても実際には得られません。 –

3

ない理由を、あなたのテーブルと、グループ内のすべての列を選択することができますか?

select 
    count(distinct name) 
from 
    people 
+0

2人のポエプルが同じ名前を持つ可能性があるため。 OPはCOUNT(DISTINCT *)について尋ねました。 –

+0

申し訳ありませんが、私は答えたときに質問の別のテキストでした。 – silent

-2

UberKludge、および特定のpostgreすることができるが、

select count(distinct table::text) from table 
0

あなたはドキュメントから、2005

;WITH cte AS (
     SELECT DISTINCT Val1,Val2, Val3 
     FROM @Table 
) 
SELECT COUNT(1) 
FROM cte 

が質問に答えるために、SQL ServerのCTEを試すことができます

行の合計数を返すように、すべての行が になるように指定します。 テーブル。 COUNT()には のパラメータはなく、 DISTINCTと一緒に使用することはできません。 COUNT()は 式パラメータを必要としません。 定義では、 の特定の 列に関する情報が使用されないためです。 COUNT(*)は、 重複を除去することなく、指定された表の 行の数を返します。それぞれの行を別々に とカウントします。これには、NULL値を含む行 が含まれます。

+0

あなたは「ドキュメンテーションから」と書かれていますが、それはどのドキュメンテーションですか? –

+0

Sql Serverのヘルプドキュメント。 http://msdn.microsoft.com/en-us/library/ms175997.aspx –

0

COUNT(*)は、クエリに一致する行の数です。

行には、rowidなどの固有の情報が含まれています。すべての行は、明確に区別されます。

代わりに、いくつかのフィールドの値の別個のインスタンスをカウントする必要があります。

+3

行に固有の情報が含まれているのはなぜですか?それは...必要ではないかもしれませんが、必要ではありません。 – Murph

0

いくつかの言語では 'distinct *'を処理できない場合があります。そのため、多くの列を区別したい場合は、 'distinct ColumnA || ColumnB 'とし、それらが異なるかどうかを判断する前に組み合わせる。変数が数値かどうか、データベースハンドラが文字列に自動型キャストを行うことができるかどうか注意してください。

+1

これは完全な証明方法ではありません。たとえば( 'test'、 'string')と( 'tes'、 't string')は同じように見えます。あなたは弦を詰めて何かをすることができますが、それは乱雑になります。より良いIMOは、DISTINCTでサブクエリを使用し、それからCOUNTを得るだけです。 –

-2
select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value) 
+0

これは質問に答えません –

関連する問題