2012-01-18 25 views
6

Tengo una tabla: abc_test con columnas n_num, k_str.Usar distinct en una columna y ordenar por en otra columna da un error

Esta consulta no funciona:

select distinct(n_num) from abc_test order by(k_str) 

Pero éste funciona:

select n_num from abc_test order by(k_str) 

¿Cómo DISTINCT y ORDER BY palabras clave trabajar internamente se cambia que la producción tanto de las consultas?

+2

Podría mostrar los resultados si ejecuta estas dos consultas? La primera consulta debería devolver el error 'ORA-01791: no una expresión SELECCIONADA' ya que no se está seleccionando la columna' k_str'. ¿Es esta la consulta real que ejecutó? (Puede ser aceptable en 9i, pero no estoy seguro). –

+0

Mismo efecto en SQL Server pero con un mensaje de error más descriptivo, "ORDER BY debe aparecer en la lista de selección si se especifica SELECT DISTINCT". – onedaywhen

Respuesta

10

Por lo que entendí de su pregunta.

distinct: - significa seleccionar uno distinto (todos los valores seleccionados deben ser únicos). orden Por: - simplemente significa ordenar las filas seleccionadas según su requisito.

El problema en su primera consulta es Por ejemplo: Tengo una tabla

ID name 
01 a 
02 b 
03 c 
04 d 
04 a 

ahora se confunde la consulta select distinct(ID) from table order by (name) qué registro se tomará para que la identificación - 04 (ya que dos valores están ahí, d y una columna en Nombre). Entonces el problema para el motor DB está aquí cuando dices ordenando por (nombre) .........

0

Usted está seleccionando la colección distinct (n_num) del resultado de su consulta. Entonces ya no hay una relación real con la columna k_str. Un n_num puede ser de dos filas, cada una de las cuales tiene un valor diferente para k_str. Por lo tanto, no puede ordenar la colección distinta (n_num) por k_str.

3

La primera consulta es imposible. Vamos a explicar esto por ejemplo. tenemos esta prueba:

n_num k_str 
2  a 
2  c 
1  b 

select distinct (n_num) from abc_test es

2 
1 

Select n_num from abc_test order by k_str es

2 
1 
2 

¿Qué quiere volver

select distinct (n_num) from abc_test order by k_str?

debe devolver solo 1 y 2, pero cómo ordenarlos?

+0

¿qué tal esto? 'select distinct (n_num) as iresult from abc_test ORDER BY iresult ASC' –

+0

Claro que puede ordenar por la primera columna. El OP fue sobre por qué esta consulta no funcionará. Lo que dices puede ser simplemente: 'selecciona n_num distinto del orden abc_test por 1' –

+0

" ¿cómo ordenarlos? " - Puedo pensar en posibles enfoques: todos arbitrariamente; ordene los valores no ambiguos en orden entonces los ambiguos en arbitrariamente; ¡Pero prefiero sospechar que estás haciendo un punto que no recuerdo! – onedaywhen

4

Se podría pensar acerca del uso de grupo por vez:

select n_num 
from abc_test 
group by n_num 
order by min(k_str) 
+0

no funcionará. k_str no es seleccionable. –

+0

@FlorinGhita ¿Qué quieres decir con eso? Acabo de probar la consulta, y para mí parece que está funcionando. –

+1

heeeei, has editado tu pregunta. 'order by min (k_str)' es una cosa diferente que 'order by k_str' –

-1

¿Usted intentó esto?

SELECT DISTINCT n_num as iResult 
FROM abc_test 
ORDER BY iResult 
+0

ver el ejemplo en mi respuesta. ¿Qué quieres devolver tu consulta? –

0

acuerdo con normas SQL, una cláusula SELECT puede referirse ya sea a como cláusulas ("alias") en la cláusula nivel SELECT superior o columnas del conjunto de resultados por la posición ordinal, y por lo tanto inferior de sus consultas sería compatible .

Parece que Oracle, en común con otras implementaciones de SQL, le permite consultar columnas que existieron (lógicamente) inmediatamente antes de proyectarse en la cláusula SELECT. No estoy seguro de si dicha flexibilidad es algo tan bueno: OMI es una buena práctica exponer el orden de clasificación a la aplicación de llamada incluyendo la columna/expresiones, etc. en la cláusula SELECT.

Como siempre, debe aplicar dsicpline para obtener resultados significativos. Para su primera consulta, la definición de orden es potencialmente completamente arbitraria. Debería agradecer el error;)

0

Este enfoque está disponible en SQL Server 2000, puede seleccionar valores distintos de una tabla y ordenar por columna diferente que no está incluido en Distinct. Pero en SQL 2012, esto generará un error "Los artículos ORDER BY deben aparecer en la lista de selección si se especifica SELECT DISTINCT".

Por lo tanto, si desea utilizar la misma función que SQL 2000, puede utilizar el número de columna para realizar el pedido (no se recomienda en la práctica recomendada).

select distinct(n_num) from abc_test order by 1 

Esto pedirá la primera columna después de obtener el resultado. Si desea que el pedido se haga en base a una columna distinta de distinta, entonces debe agregar esa columna también en la instrucción de selección y usar el número de columna para ordenar.

select distinct(n_num), k_str from abc_test order by 2 
-1

que puede hacer

select distinct top 10000 (n_num) --assuming you won't have more than 10,000 rows     
from abc_test order by(k_str) 
1

Cuando llegué mismo error, lo tengo resuelto cambiando como

SELECT n_num 
FROM(
    SELECT DISTINCT(n_num) AS n_num, k_str 
    FROM abc_test 
) as tbl 
ORDER BY tbl.k_str 
Cuestiones relacionadas