2012-01-18 2 views
6

Mam tabelę: abc_test z kolumnami n_num, k_str.Używanie różnych w kolumnie i wykonywanie poleceń przez inną kolumnę daje błąd

To zapytanie nie robi praca:

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

Ale to działa:

select n_num from abc_test order by(k_str) 

Jak DISTINCT i ORDER BY słowa kluczowe działają wewnętrznie, że wyjście z obu zapytań zostanie zmieniony?

+2

można pokazać wyniki, jeśli uruchomić te dwa pytania? Pierwsze zapytanie powinno zwrócić błąd 'ORA-01791: nie wyselekcjonowane wyrażenie', ponieważ kolumna 'k_str' nie jest wybrana. Czy to jest rzeczywiste zapytanie, które uruchomiłeś? (Może to być dopuszczalne w 9i, ale nie mogę być tego pewien.) –

+0

Ten sam efekt na serwerze SQL, ale z bardziej opisowym komunikatem o błędzie, "ORDER BY elementy muszą pojawić się na liście wyboru, jeśli określono DISTINCT SELECT." – onedaywhen

Odpowiedz

10

O ile zrozumiałem na podstawie twojego pytania.

Wyróżnienie: - oznacza zaznaczenie (wszystkie wybrane wartości powinny być unikalne). zamówienie Według: - oznacza po prostu zamówić wybrane wiersze zgodnie z wymaganiami.

Problem w pierwszym zapytaniu jest Na przykład: Mam tabeli

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

teraz zapytanie select distinct(ID) from table order by (name) jest zdezorientowany, który rekord należy podjąć dla identyfikatora - 04 (ponieważ dwie wartości są tam, d i w kolumnie Nazwa). Więc problem z silnikiem DB jest tutaj, gdy mówisz porządek według (nazwa) .........

0

Wybieracie kolekcję odrębną (n_num) z zestawu wyników z zapytania. Tak więc nie ma już rzeczywistego związku z kolumną k_str. N_num może pochodzić z dwóch rzędów, z których każdy ma inną wartość k_str. Więc nie możesz zamówić kolekcji odrębnej (n_num) przez k_str.

3

Pierwsze zapytanie jest niemożliwe. Wyjaśnijmy to na przykładzie. mamy ten test:

n_num k_str 
2  a 
2  c 
1  b 

select distinct (n_num) from abc_test jest

2 
1 

Select n_num from abc_test order by k_str jest

2 
1 
2 

Czego chcesz powrócić

select distinct (n_num) from abc_test order by k_str?

powinien zwracać tylko 1 i 2, ale jak je zamówić?

+0

co z tym? 'select distinct (n_num) as isresult od abc_test ORDER BY iresult ASC' –

+0

Oczywiście, że może zamówić przez pierwszą kolumnę. OP o tym, dlaczego to zapytanie nie zadziała. To, co mówisz, może być po prostu: 'wybierz różne n_num z abc_test order przez 1' –

+0

" jak je zamówić? " - Mogę myśleć o możliwych podejściach: wszystko arbitralnie; porządkuje jednoznaczne wartości, a następnie dwuznaczne w arbitralny sposób; itp. Ale raczej podejrzewam, że robiłeś punkt, który jest stracony na mnie! – onedaywhen

4

Można by pomyśleć o używaniu przez grupę zamiast:

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

nie będzie działać. k_str nie można wybrać. –

+0

@FlorinGhita Co przez to rozumiesz? Właśnie wypróbowałem zapytanie i dla mnie wygląda na to, że działa. –

+1

heeeei, edytowałeś swoje pytanie. 'order by min (k_str)' to inna rzecz, 'order by k_str' –

-1

pan spróbować?

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

zobacz przykład w mojej odpowiedzi. Co chcesz zwrócić swoje zapytanie? –

0

według standardów SQL: SELECT klauzula może odnosić się zarówno do jak klauzul („aliasów”) na górnym poziomie SELECT klauzuli lub kolumn z wynikowego przez porządkowej pozycji, a więc dolny z zapytań byłoby zgodne .

Wygląda na to, że Oracle, podobnie jak inne implemetacje SQL, umożliwia odwoływanie się do kolumn, które istniały (logicznie) bezpośrednio przed wyświetleniem w klauzuli SELECT. Nie jestem pewien, czy taka elastyczność jest tak dobra: IMO dobrą praktyką jest odsłonięcie porządku sortowania do aplikacji wywołującej przez włączenie kolumny/wyrażeń itp. Do klauzuli SELECT.

Jak zawsze, musisz zastosować dsiclinę, aby uzyskać znaczące wyniki. W pierwszym zapytaniu definicja zamówienia jest potencjalnie całkowicie arbitralna. Użytkownik powinien być wdzięczny za błąd;)

0

To podejście jest dostępne w SQL Server 2000, można wybrać różne wartości z tabeli i kolejności według różnych kolumn, które nie jest zawarte w Distinct. Ale w SQL 2012 będzie to przez ciebie błąd "ORDER BY elementy muszą pojawić się na liście select, jeśli określono DISTINCT SELECT."

Tak więc, jeśli chcesz użyć tej samej funkcji co w SQL 2000, możesz użyć numeru kolumny do zamawiania (nie jest to zalecane w najlepszej praktyce).

select distinct(n_num) from abc_test order by 1 

Spowoduje to zamówienie pierwszej kolumny po pobraniu wyniku. Jeśli chcesz, aby zamawianie zostało wykonane na podstawie innej kolumny niż wyróżniona, musisz dodać tę kolumnę również w instrukcji select i użyć numeru kolumny do zamówienia przez.

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

można zrobić

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

Kiedy mam ten sam błąd, mam go rozwiązać, zmieniając go jako

SELECT n_num 
FROM(
    SELECT DISTINCT(n_num) AS n_num, k_str 
    FROM abc_test 
) as tbl 
ORDER BY tbl.k_str 
Powiązane problemy