2009-12-01 7 views
13

¿Por qué no podemos usar count(distinct *) en SQL? Como en contar todas las filas distintas?Cuenta SQL (*) y distinto

+0

¿Qué quiere decir con 'distinct rows'? –

+0

¿Tiene filas que están duplicadas en toda la fila, es eso lo que está tratando de encontrar? –

+0

Ahora cuando lo pienso, porque nuestras tablas están normalizadas, no tendremos exactamente las mismas filas, así que es inútil ¿no? ¿Es esta la razón? –

Respuesta

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

Aunque yo recomiendo que volver a pensar las consultas que utilizan DISTINCT. En un gran porcentaje de casos, GROUP BY es más apropiado (y más rápido).

EDIT: Después de leer los comentarios de interrogación, debo señalar que se debe Nunca pedir a los DBMS para hacer más trabajo de lo que realmente se necesita hacer para obtener un resultado. Si sabe de antemano que no habrá filas duplicadas en una tabla, entonces no use DISTINCT.

+0

@CHristian - Hola, nunca antes lo había visto de esa manera. por curiosidad lo ejecuté con una tabla existente en mi extremo y obtengo 'Sintaxis incorrecta cerca') ''. trabajar en el servidor ms sql? nota - mi selección dentro de los paréntesis se ejecuta perfectamente – Kamal

+2

En Oracle DISTINCT y GROUP BY tienen el mismo plan de ejecución porque DISTINCT se implementa utilizando GROUP BY. Entonces no debería haber diferencia. –

+0

@Kamal: Perdón, olvidé que SQL Server es un poco dudoso con las consultas anidadas. Agregar un nombre de alias al final ('como T') resolvió el problema. –

1

De hecho, puede.

Si tiene un identificador, no tendrá filas completamente distintas. Pero que podría ser por ejemplo:

SELECT COUNT(DISTINCT SenderID) FROM Messages 
9

Se pueden seleccionar todas las columnas de la tabla y el grupo de ...

SELECT column1, column2, column3, count(*) 
FROM someTable 
GROUP BY column1, column2, column3 
por qué no
+0

Esto en realidad no obtiene lo que la pregunta pregunta sin embargo. –

3

?

select 
    count(distinct name) 
from 
    people 
+0

Porque dos personas podrían tener el mismo nombre. El OP preguntó acerca de COUNT (DISTINCT *). –

+0

Lo siento, fue otro texto en la pregunta cuando respondí. – silent

-2

UberKludge, y puede ser POSTGRE específica, pero

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

Usted puede tratar de un CTE en SQL Server 2005

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

Para responder a la pregunta, De la documentación

Especifica que todas las filas deben ser contadas para devolver el número total de filas en una mesa. COUNT () no toma los parámetros y no se puede usar con DISTINCT. COUNT () no requiere un parámetro de expresión porque, por la definición , no utiliza la información sobre cualquier columna particular . COUNT (*) devuelve el número de filas en una tabla especificada sin eliminando duplicados. Cuenta cada fila por separado. Esto incluye filas que contienen valores nulos.

+0

Cuando dice "De la documentación" ¿qué documentación sería? –

+0

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

0

COUNT (*) es el número de filas que coincidan con una consulta.

Una fila contiene información exclusiva, como rowid. Todas las filas son, por definición, distintas.

En su lugar, debe contar las distintas instancias de valores en algún campo.

+3

¿Por qué una fila contiene información única? No tiene que ... probablemente debería pero no es * obligatorio *. – Murph

0

algunos idiomas pueden no ser capaces de manejar 'distinct *' así que, si desea la distinción hecha a través de muchas columnas, puede usar 'distinct ColumnA || ColumnB ', combinando los valores antes de juzgar si son diferentes. Tenga en cuenta si sus variables son numéricas y su manejador de base de datos puede realizar una conversión automática en cadenas de caracteres.

+1

Esto tampoco es un método de prueba completo tal como está. Por ejemplo, ('test', 'string') y ('tes', 't string') se verían igual. Podrías hacer algo con relleno de cuerdas, pero se vuelve desordenado. Mejor IMO para simplemente usar una subconsulta con DISTINCT y luego obtener un COUNT de eso. –

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

Esto no responde la pregunta –

Cuestiones relacionadas