Wpis z mikrobloga

W jaki dokladnie sposób działa klauzula order by w takim zapytaniu

select s.sport
, r.player
, r.result
, s.units units
from plchsports s
join plch
results r
on r.sportid = s.sportid
order by s.sport, case s.bestresult when 'HIGH' then r.result
else 10 end desc,
case s.best
result when 'LOW' then r.result
else 10 end asc;

Z nieposortowanych danych otrzymuje wyniki jak w załączniku
Czy order by tworzy sobie dla kazdego wiersza osobno kolejność sortowania np dla "HIGH" będzie to s.sport - > r.result -> 10
a dla "LOW" s.sport - > 10 -> r.result ?
Niie do końca rozumiem w jaki sposób powoduje to posortowanie danych w podanej kolejności,
Gdybym napisał w klauzuli po prostu "Order by s.sport,10" dostałbym błąd Oracla dlaczego wiec tutaj to akceptuje

#programowanie #oracle #sql #bazydanych
źródło: comment_1633613193cKP4sIzl9KMwrdCkei2UZT.jpg
  • 3
@antagonista1111: nie znam oracla, ale na chłopski rozum przyjmuje 10 jako jakąś wartość środkową:
czyli:
wiersze z 'HIGH' sortuje po result MALEJĄCO, inaczej przyjmuje tam 10,
następnie
wiersze z 'LOW' sortuje po result ROSNĄCO, w pozostałych przyjmuje 10.

czyli najpierw high malejąco, potem 10, potem low rosnąco (?) - zakładając, że high nie będzie poniżej 10 i w low powyżej 10
@RRybak: ta 10 jest tam wpisana przypadkowo, może tam być wpisana dowolna inna liczba, a wynik i tak będzie taki sam.
Według logiki Oracla ta 10 powinna symbolizowac ze sortuje po 10 kolumnie w zapytaniu, ale zapytanie ma tylko 5 wiec normalnie zwróciłoby blad jednak gdy używam case w Order By takiego bledu nie ma.
@antagonista1111: wydaje mi się, że łatwiej Ci będzie zrozumieć czemu to działa gdy sobie dodasz te dwie kolumny do selecta i zobaczysz, co się w nich wyświetla :)

select
....
, case s.bestresult when 'HIGH' then r.result else 10 end desc
, case s.bestresult when 'LOW' then r.result else 10 end asc;
from ...

dodatkowo, imho, ponieważ ta wartość 10 jest przyjęta arbitralnie i dla osoby czytającej kod po raz pierwszy