2009-03-27 8 views
6

¿Incluir DISTINCT en una consulta SELECT implica que el conjunto resultante debe ser ordenado?SELECCIONE DISTINCT implica algún tipo de resultado

No creo que sí, pero estoy buscando una respuesta autorizada (enlace web).

Tengo una consulta como esta:

Select Distinct foo 
From Bar 

en Oracle, los resultados son distintos pero no están en el orden establecido. En Jet/MS-Access parece que se está realizando un trabajo adicional para garantizar que los resultados sean ordenados. Supongo que Oracle está siguiendo las especificaciones en este caso y MS Access va más allá.

Además, ¿hay alguna manera de dar a la tabla una pista de que debería estar ordenando en foo (a menos que se especifique lo contrario)?

Respuesta

4

Desde el SQL92 specification:

Si se especifica DISTINCT, entonces vamos TXA ser el resultado de eliminar valores duplicados redundantes de TX. De lo contrario, deje que TXA sea TX.

...

4) Si no se especifica, el orden de las filas de Q depende de la implementación.

En última instancia, la respuesta real es que DISTINCT y ORDER BY son dos partes separadas de la instrucción SQL; Si no tiene una cláusula ORDER BY, los resultados, por definición, no se ordenarán específicamente.

1

No, no implica un tipo. En mi experiencia, ordena por el índice conocido, que puede ser foo.

¿Por qué ser sutil? ¿Por qué no seleccionar Select Distinct foo from Bar Order by foo?

+0

¿Qué tal porque ese no es el orden que desea? – dkretz

+0

En su publicación "sorting on foo (a menos que se especifique lo contrario)", pregunto por qué no especificamos foo a menos que se especifique lo contrario – jerebear

+0

¿Por qué ser sutil y sugerente? Simplemente no quiero tener que recompilar y volver a implementar en este punto. Si pudiera darle una pista a Oracle, eso resolvería mi problema y podría poner la solución explícita en un momento más conveniente. –

1

Que yo sepa, no. La única razón por la que puedo pensar es que SQL Server ordenaría internamente los datos para detectar y filtrar duplicados, y así devolverlos de una manera "preordenada". Pero no confiaría en ese "efecto secundario" :-)

0

En al menos un servidor que he usado (probablemente Oracle o SQL Server, hace unos seis años), SELECT DISTINCT fue rechazado si no lo hizo t tiene una cláusula ORDER BY. Fue aceptado en el "otro" servidor (Oracle o SQL Server). Su experiencia puede ser diferente.

3

no hay un vínculo respuesta "autoridad", ya que esto es algo que no hay garantías de SQL Server.

A menudo verá los resultados en orden cuando use distinct como efecto secundario de los mejores métodos para encontrar esos resultados. Sin embargo, cualquier cantidad de otras cosas puede confundir los resultados, y algunos servidores pueden devolver los resultados de tal manera que no se ordenan, incluso si tenían que ordenar para obtener los resultados.

En pocas palabras: si su servidor no garantiza algo, no debe contar con él.

-1

Sí. Oracle usa un tipo, calcule un distinto. Puedes ver eso si miras el plan de explicación. El hecho de que hizo una especie para ese cálculo no implica de ninguna manera que el conjunto de resultados será ordenado. Si desea que el conjunto de resultados esté ordenado, debe usar la cláusula ORDER BY.

+0

Oracle 10 y 11 usan hashing para calcular un orden distinto, sin clasificar. – tuinstoel

+0

Oracle 10 y 11 * pueden * usar hash. –

+0

Puedo creer. He observado ordenar en el plan en respuesta a una distinta. Estoy atascado en 9i y 10g. – EvilTeach

5

No. Hay una serie de circunstancias en las que DISTINCT en Oracle no implica una clasificación, la más importante de las cuales es el algoritmo hash utilizado en 10g + para las operaciones group by y distinct.

Siempre especifique ORDER BY si desea un conjunto de resultados ordenados, incluso en 9i o menos.

+0

No creo que eso responda la pregunta. Por supuesto, debe especificar ambos si desea los dos. ¿Pero se realiza una clasificación basada en DISTINCT independientemente de la clasificación solicitada (o no ordenada)? – dkretz

+0

P: "¿Incluir DISTINCT en una consulta SELECT implica que el conjunto resultante se debe ordenar?" A: "Hay una serie de circunstancias en las que un DISTINCT en Oracle no implica un tipo" Antes de 10g se ordenaba un conjunto de resultados DISTINCT ** por lo general **, pero no siempre. –

0

Como las respuestas dicen en su mayoría, DISTINCT no ordena una clasificación, solo ORDER BY ordena eso. Sin embargo, una forma estándar de lograr resultados DISTINCT es ordenar; el otro es ajustar los valores (que tiende a conducir a la secuenciación semialeatoria). Confiar en el efecto de clasificación de DISTINCT sería una tontería.

1

En mi caso (servidor SQL), como ejemplo, tenía una lista de países con un valor numérico X asignado a cada uno. Cuando seleccioné una orden distinct * distinta de Table por X, la ordenó X pero al mismo tiempo se ordenaron los países del conjunto de resultados que no se implementaron directamente. Desde mi experiencia, diré que distinct implica un tipo implícito.

+0

¿Se puede agregar un ejemplo de código (o dividir lo que parece ser su ejemplo de código en un párrafo aparte)? –

+0

@Jess Bowers: A continuación se muestra el fragmento: Sólo para mencionar que tanto ABC y #result se denominan tablas temporales en un procedimiento almacenado: 'Insertar en #Result \t seleccione la parte superior DISTINCT (10) * ROM ABC X \t orden XY asc select * from # Result' –

Cuestiones relacionadas