Problem z sortowaniem przy użyciu NVL

0

Cześć mam takiego selecta i mam problem z ORDER BY w nvl wyskakuje mi komunikat że brak prawego nawiasu i nie mam pomysłu jak to obejść ;/

SELECT k.pa_id, 
       k.jed_id, 
       k.alternatywa,
       k.pod_id,
       k.id kt_id, 
       '' spfw_id,
       Nvl((SELECT u.id 
            FROM uruchomienia u 
            WHERE u.pa_id = p.id 
            AND ROWNUM < 2 
            ORDER BY u.data_utworzenia DESC   -- bez order by pójdzie
            ), '') id, 
       To_Date(NULL)  data_utworzenia, 
       p.typ_id pa_typ_id,
       p.obi_id pa_obi_id, 
       p.opis pa_opis
FROM karty_technologiczne k, pozycje_asortymentowe p
WHERE k.pa_id = p.id;

Dzięki z góry za podpowiedzi!

0

Coś tam gdzieś tam. Napisz dokładnie, z czym masz problem.

0

@S4t: Select nie działa, wyrzuca mi błąd, wiem że do błędu dochodzi przy NVL:

Nvl((SELECT u.id 
            FROM uruchomienia u 
            WHERE u.pa_id = p.id 
            AND ROWNUM < 2 
            ORDER BY u.data_utworzenia DESC   -- bez order by pójdzie
            ), '') id, 

a dokładnie to przy klazuli ORDER BY, jeżeli ją za komentuje to się kompiluje a istotne jest dla mnie sortowanie.
Błąd jaki mi wyrzuca to komunikat że brakuje prawego nawiasu. Składnia jest ok, więc nie wiem dlaczego mi błąd wyrzuca.

1

to sortowanie i ten rownum jest do bani ... lepiej użyj czegoś takiego;
Fetch offset
druga sprawa co w sytuacji gdy select rzuci Ci no_data_found?
Bo na ten moment ten order by NIC CI NIE DA. Oracle prawdopodobnie najpierw wykona zapytanie, zawęzi je do pierwszego rekordu, który uzna za stosowny (prawdopodobnie data utworzenia wpisu) następnie zrobi ordera. Przykład tutaj:
http://sqlfiddle.com/#!4/1244b1/27

Lepszym wyjściem jest pobranie max z daty jak Ci podał poniżej @Los Bomberos
Natomiast jak nie chcesz lub nie możesz z jakichś przyczyn tego tak przerobić to tu masz przykład z NVL:
http://sqlfiddle.com/#!4/1244b1/30

1

Najlepiej jak być wyrzucił, jaki tam masz błąd. Ale pewnie chodzi to ze w subquery order by jest bez sensu.

1

Sugerowałbym:

  • sprawdzenie, czy na pewno podzapytanie, które masz, jest zgodne z zamierzeniem; wydaje mi się, że chcesz wybrać najnowsze uruchomienia.id, a wybierasz to z rownum = 1 (order by jest stosowany na końcu)
  • wrzucanie modelu i przykładowych danych na http://sqlfiddle.com/ i podawanie linka, to pomoże w uzyskaniu odpowiedzi
  • przejście na współczesną notację jonów
  • zrobienie czegoś w stylu (piszę bez sprawdzenia):
SELECT 
       Nvl((SELECT max(u.id) 
            FROM uruchomienia u 
            WHERE u.data_utworzenia = (select max(data_utworzenia)
                                         from uruchomienia
                                        where pa_id = p.id
                                      )
                  and u.pa_id = p.id
            ), '') id

FROM karty_technologiczne k, pozycje_asortymentowe p
WHERE k.pa_id = p.id;
0

@Los Bomberos:

  • O to mi właśnie chodziło
  • Z pewnością skorzystam z tego linku który podałeś przy następnym pytaniu
  • zdaję sobie z tego sprawę że te stare joiny domyślnie mają w sobie inner Join. Z jakiego powodu sugerujesz żeby korzystać z nowej notacji?

Dzięki

0

@Vorbizzz. Możliwe, że to jednostkowe i niereprezentatywne doświadczenie, ale w firmie, w której pracowałem, byli SQLowcy z różnym poziomem stażu (od ludzi klepiących od 20 lat po świeżaki z pierwszej pracy na pół etatu w trakcie studiów). Ci pierwsi pisali podobnie, jak w Twoim kodzie (także wspomniane oraclowe (+) do left/right joinów), drudzy left/right. Pytałem jednych i drugich dlaczego. Odpowiadali, że tak się na studiach nauczyli;). Ci pierwsi będą wymierali, więc przejście na left/right postrzegam jako nieuchronność dziejową;)

0

@Los Bomberos:
No ja jestem właśnie takim świeżakiem i z sql miałem mało do czynienia i trafiłem w takie miejsce że przez najbliższe miesiące to właśnie z niego będę korzystał :)
I właśnie pracuje z kimś co ma tak jak mówisz 20+ doświadczenia i pisze w taki sposób swoja drogą on jest wygodny jak dla mnie wiec jestem zaskoczony zmianą.

0

Jeśli to najbliższe miesiące i tyle - to spoko. Jeśli wiążesz przyszłość z SQLem - przypuszczam, że left/right wygra.
Swoją drogą mi się wygodniej czyta SQL, jeśli informacje o tym, jakie tabele są łączone i na jakich warunkach, są blisko siebie. W starej notacji możesz mieć listę 20 tabel we from, a potem 30 linijek warunków łączenia i szukasz, do czego to się dokładnie odwołuje. Brzydal.

0

@Vorbizzz: Może jak dojdę do takich selectów to też mi to zacznie przeszkadzać xD

1 użytkowników online, w tym zalogowanych: 0, gości: 1