2009-12-01 11 views
13

Warum können wir count(distinct *) in SQL nicht verwenden? Wie in, um alle verschiedenen Zeilen zu zählen?SQL-Anzahl (*) und distinct

+0

Was meinen Sie mit "distinct rows"? –

+0

Haben Sie Zeilen, die in der gesamten Zeile dupliziert sind, ist das, was Sie suchen? –

+0

Nun, wenn ich daran denke, weil unsere Tabellen normalisiert sind, haben wir nicht genau die gleichen Zeilen, also ist es nutzlos richtig ?? Ist das der Grund? –

Antwort

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

Obwohl ich, dass Sie stark darauf hin, alle Fragen neu denken, die DISTINCT verwenden. In einem großen Prozentsatz der Fälle ist GROUP BY geeigneter (und schneller).

EDIT: die Frage Kommentare gelesen haben, sollte ich, dass Sie nie das DBMS fragen sollte weisen darauf hin, mehr Arbeit zu tun, als tatsächlich benötigt ein Ergebnis erhalten tun. Wenn Sie im Voraus wissen, dass es keine doppelten Zeilen in einer Tabelle geben wird, verwenden Sie nicht DISTINCT.

+0

@CHristian - hi, habe es noch nie so gemacht. aus Neugier lief es mit einer vorhandenen Tabelle an meinem Ende und ich bekomme 'falsche Syntax in der Nähe') ''. Arbeit in ms SQL Server? Hinweis - meine Auswahl innerhalb der Klammern läuft perfekt – Kamal

+2

Auf Oracle DISTINCT und GROUP BY haben den gleichen Ausführungsplan, da DISTINCT in implementiert GROUP BY. Also sollte es keinen Unterschied geben. –

+0

@Kamal: Entschuldigung, vergessen Sie, dass SQL Server mit verschachtelten Abfragen ein wenig unsicher ist. Das Hinzufügen eines Alias-Namens am Ende ('als T') löste das Problem. –

1

Sie können in der Tat.

Wenn Sie einen Bezeichner haben, werden Sie keine völlig unterschiedlichen Zeilen haben. Aber Sie könnten zum Beispiel tun:

SELECT COUNT(DISTINCT SenderID) FROM Messages 
9

Sie können wählen, um alle Spalten in der Tabelle und Gruppe von ...

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

Das bekommt eigentlich nicht, was die Frage fragt. –

3

warum nicht?

select 
    count(distinct name) 
from 
    people 
+0

Weil zwei Leute den gleichen Namen haben könnten. Das OP fragte nach COUNT (DISTINCT *). –

+0

Entschuldigung, es war ein anderer Text in der Frage, als ich antwortete. – silent

-2

UberKludge und kann postgre spezifisch, aber

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

Sie können einen CTE in SQL Server versuchen, 2005

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

Zur Beantwortung der Frage, Aus der Dokumentation

Gibt an, dass alle Zeilen gezählt werden sollen, um die Gesamtzahl der Zeilen zurückzugeben ein Tisch. COUNT () benötigt keine Parameter und kann nicht mit DISTINCT verwendet werden. COUNT () benötigt keinen Ausdrucksparameter, da Definition Informationen über eine bestimmte Spalte nicht verwendet. COUNT (*) gibt die Anzahl Zeilen in einer angegebenen Tabelle zurück, ohne dass Duplikate entfernt werden. Es zählt jede Zeile separat. Dazu gehören Zeilen, die Nullwerte enthalten.

+0

Wenn Sie sagen: "Aus der Dokumentation" welche Dokumentation wäre das? –

+0

Sql Server Hilfe Dokumentation. http://msdn.microsoft.com/en-us/library/ms175997.aspx –

0

COUNT (*) ist die Anzahl der Zeilen, die mit einer Abfrage übereinstimmen.

Eine Zeile enthält eindeutige Informationen wie Rowid. Alle Zeilen sind per Definition verschieden.

Sie müssen stattdessen die verschiedenen Instanzen von Werten in einem Feld zählen.

+3

Warum enthält eine Zeile eindeutige Informationen? Es muss nicht ... es sollte wahrscheinlich, aber es ist nicht * erforderlich *. – Murph

0

einige Sprachen sind möglicherweise nicht in der Lage, 'distinct *' zu behandeln. Wenn Sie also die Unterscheidung über viele Spalten vornehmen möchten, können Sie 'distinct ColumnA || verwenden ColumnB ', kombiniert die Werte vor der Beurteilung, wenn sie unterschiedlich sind. Achten Sie darauf, ob Ihre Variablen numerisch sind und Ihr Datenbank-Handler eine automatische Typumwandlung in Zeichenketten vornehmen kann.

+1

Dies ist auch keine vollständige Beweismethode wie sie ist. Zum Beispiel würden ('test', 'string') und ('tes', 't string') gleich aussehen. Sie könnten etwas mit dem Auffüllen der Saiten tun, aber es wird unordentlich. Besser IMO, um nur eine Unterabfrage mit DISTINCT zu verwenden und dann einen COUNT davon zu erhalten. –

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

Dies beantwortet die Frage nicht –