2012-01-18 13 views
6

Ho una tabella: abc_test con colonne n_num, k_str.L'utilizzo di distinti in una colonna e l'esecuzione dell'ordine su un'altra colonna restituisce un errore

Questa interrogazione pretende molto lavoro:

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

Ma questo funziona:

select n_num from abc_test order by(k_str) 

Come DISTINCT e ORDER BY parole chiave lavorano internamente che la produzione di entrambe le domande è cambiato?

+2

Potrebbe mostrare i risultati se si esegue quei due query? La prima query dovrebbe restituire l'errore 'ORA-01791: non un'espressione SELEZIONATA' poiché la colonna' k_str' non è selezionata. È questa la query effettiva che hai eseguito? (Può essere accettabile in 9i, ma non ne sono sicuro.) –

+0

Stesso effetto su SQL Server ma con un messaggio di errore più descrittivo, "Gli articoli ORDER BY devono essere visualizzati nell'elenco di selezione se viene specificato SELECT DISTINCT." – onedaywhen

risposta

10

Per quanto ho capito dalla tua domanda.

distinto: - significa selezionare un distinto (tutti i valori selezionati devono essere univoci). ordina per: - indica semplicemente di ordinare le righe selezionate secondo le tue esigenze.

Il problema nella prima query è Per esempio: ho una tabella

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

momento la query select distinct(ID) from table order by (name) è confuso che registrano dovrebbe prendere per ID - 04 (dal momento che due valori ci sono, d e una colonna in Nome). Quindi il problema per il motore DB è qui quando dici ordina per (nome) .........

0

Si sta selezionando la raccolta distinta (n_num) dal set di risultati dalla query. Quindi non esiste più alcuna relazione effettiva con la colonna k_str. Un n_num può essere composto da due righe ciascuna con un valore diverso per k_str. Quindi non puoi ordinare la raccolta distinta (n_num) di k_str.

3

La prima query è impossibile. Questo lo spieghiamo con l'esempio. abbiamo questa prova:

n_num k_str 
2  a 
2  c 
1  b 

select distinct (n_num) from abc_test è

2 
1 

Select n_num from abc_test order by k_str è

2 
1 
2 

Cosa vuoi tornare

select distinct (n_num) from abc_test order by k_str?

dovrebbe restituire solo 1 e 2, ma come ordinarli?

+0

come su questo? 'selezionare distinto (n_num) come iresult da abc_test ORDER BY iresult ASC' –

+0

Certo che può ordinare per prima colonna. L'OP riguardava il motivo per cui questa query non funzionava. Quello che dici può essere semplicemente: 'seleziona n_num distinto dall'ordine abc_test di 1' –

+0

" come ordinarli? " - Posso pensare a possibili approcci: tutti arbitrariamente; ordinare i valori inequivocabili per poi arbitrariamente gli ambigui; ecc. Ma ho il sospetto che tu stia facendo un punto che è perso su di me! – onedaywhen

4

si potrebbe pensare di utilizzare GROUP BY invece:

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

non funzionerà. k_str non è selezionabile. –

+0

@FlorinGhita Cosa intendi con questo? Ho appena provato la query, e per me sembra che funzioni. –

+1

heeeei, hai modificato la tua domanda. 'order by min (k_str)' è una cosa diversa che ordina da k_str' –

-1

Hai provato questo?

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

vedere l'esempio nella mia risposta. Cosa vuoi restituire la tua domanda? –

0

Secondo SQL standard, una clausola SELECT possono riferirsi al come clausole ("alias") nella clausola di livello superiore SELECT o le colonne del gruppo di risultati da posizione ordinale, e quindi inferiore delle vostre domande sarebbe compatibile .

Sembra che Oracle, in comune con altre implementazioni SQL, consente di fare riferimento a colonne esistenti (logicamente) immediatamente prima di essere proiettate nella clausola SELECT. Non sono sicuro se tale flessibilità sia una cosa così positiva: IMO è buona norma esporre l'ordinamento all'applicazione chiamante includendo la colonna/espressioni ecc. Nella clausola SELECT.

Come sempre, è necessario applicare dsicpline per ottenere risultati significativi. Per la tua prima domanda, la definizione di ordine è potenzialmente del tutto arbitraria. Devi essere grato per l'errore;)

0

Questo approccio è disponibile in SQL Server 2000, puoi selezionare valori distinti da una tabella e ordinare per colonna diversa che non è incluso in Distinct. Tuttavia, in SQL 2012, tramite l'utente verrà visualizzato un errore "Gli articoli ORDER BY devono essere visualizzati nell'elenco di selezione se si specifica SELECT DISTINCT."

Quindi, se si desidera utilizzare la stessa funzionalità di SQL 2000, è possibile utilizzare il numero di colonna per l'ordine (non consigliato nelle migliori pratiche).

select distinct(n_num) from abc_test order by 1 

Questo ordinerà la prima colonna dopo aver recuperato il risultato. Se si desidera che l'ordine venga eseguito in base a colonne diverse da quelle distinte, è necessario aggiungere la colonna anche nell'istruzione select e utilizzare il numero di colonna per ordinare.

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

si può fare

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

Quando ho ottenuto lo stesso errore, ce l'ho risolto modificando come

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