2009-12-01 16 views
13

Perché non è possibile utilizzare count(distinct *) in SQL? Come per contare tutte le righe distinte?Conteggio SQL (*) e distinto

+0

Cosa intendi per "righe distinte"? –

+0

Hai righe duplicate nell'intera riga, è quello che stai cercando di trovare? –

+0

Ora, quando ci penso, perché i nostri tavoli sono normalizzati, non avremo esattamente le stesse righe quindi è inutile vero ?? È questa la ragione ?? –

risposta

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

Anche se ti suggerisco vivamente di ri-pensare qualsiasi query che utilizzano DISTINCT. In una grande percentuale di casi, GROUP BY è più appropriato (e più veloce).

EDIT: Dopo aver letto le osservazioni di domanda, vorrei sottolineare che si dovrebbe mai chiedere ai DBMS di fare più lavoro di quanto in realtà deve fare per ottenere un risultato. Se sai in anticipo che non ci saranno righe duplicate in una tabella, non utilizzare DISTINCT.

+0

@CHristian - ciao, mai visto prima. per curiosità lo ho eseguito con una tabella esistente sulla mia estremità e ho trovato 'sintassi errata vicino') ''. funziona nel ms sql server? nota - la mia selezione tra parentesi scorre perfettamente – Kamal

+2

Su Oracle DISTINCT e GROUP BY hanno lo stesso piano di esecuzione perché DISTINCT è implementato utilizzando GROUP BY. Quindi non ci dovrebbero essere differenze. –

+0

@Kamal: Scusa, ho dimenticato che SQL Server è un po 'incerto con le query nidificate. L'aggiunta di un nome alias alla fine ('as T') ha risolto il problema. –

1

Si può davvero.

Se hai un identificatore, però, non avrai righe completamente distinte. Ma si potrebbe fare per esempio:

SELECT COUNT(DISTINCT SenderID) FROM Messages 
9

è possibile selezionare tutte le colonne della tabella e di gruppo da ...

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

Questo in realtà non ottiene quello che la domanda chiede però. –

3

?

select 
    count(distinct name) 
from 
    people 
+0

Perché due persone potrebbero avere lo stesso nome. L'OP ha chiesto informazioni su COUNT (DISTINCT *). –

+0

Mi dispiace, era un altro testo nella domanda quando ho risposto. – silent

-2

UberKludge, e può essere Postgre specifica, ma

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

Si può provare un CTE in SQL Server 2005

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

Per rispondere alla domanda, Dalla documentazione

Specifica che tutte le righe devono essere contate per restituire il numero totale di righe in un tavolo. COUNT () non utilizza i parametri e non può essere utilizzato con DISTINCT. COUNT () non richiede un parametro di espressione perché, con la definizione , non utilizza le informazioni su alcuna colonna particolare . COUNT (*) restituisce il numero di righe in una tabella specificata senza eliminando i duplicati. Conta ogni riga separatamente. Ciò include le righe che contengono valori nulli.

+0

Quando dici "Dalla documentazione" quale documentazione sarebbe? –

+0

Documentazione della Guida di SQL Server. http://msdn.microsoft.com/en-us/library/ms175997.aspx –

0

COUNT (*) è il numero di righe corrispondenti a una query.

Una riga contiene informazioni univoche come il rowid. Tutte le righe sono per definizione distinte.

È necessario contare le istanze distinte dei valori in alcuni campi.

+3

Perché una riga contiene informazioni univoche? Non deve ... probabilmente dovrebbe ma non è * richiesto *. – Murph

0

alcuni languajes potrebbero non essere in grado di gestire 'distinto *' così, se si desidera la distinzione fatta attraverso molte colonne, si potrebbe voler usare 'distinta colonna A || Colonna B ', combinando i valori prima di giudicare se sono diversi. Tieni presente se le tue variabili sono numeriche e il tuo gestore di database può eseguire un typecast automatico sulle stringhe di caratteri.

+1

Anche questo non è un metodo a prova completa così com'è. Ad esempio, ('test', 'stringa') e ('tes', 't stringa') sarebbero uguali. Potresti fare qualcosa con il padding delle stringhe, ma diventa caotico. Meglio IMO per usare solo una subquery con DISTINCT e quindi ottenere un COUNT da quello. –

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

Questo non risponde alla domanda –

Problemi correlati