Problem z sortowaniem przy użyciu NVL

Problem z sortowaniem przy użyciu NVL
VO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:53
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ść ;/

Kopiuj
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!

edytowany 1x, ostatnio: Vorbizzz
S4
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:1268
0

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

VO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:53
0

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

Kopiuj
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.

edytowany 1x, ostatnio: Vorbizzz
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
  • Postów:1596
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

edytowany 3x, ostatnio: woolfik
S4
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:1268
1

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

LB
  • Rejestracja:ponad 7 lat
  • Ostatnio:8 dni
  • Postów:75
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):
Kopiuj
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;
VO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:53
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

LB
  • Rejestracja:ponad 7 lat
  • Ostatnio:8 dni
  • Postów:75
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ą;)

edytowany 1x, ostatnio: Los Bomberos
VO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:53
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ą.

LB
  • Rejestracja:ponad 7 lat
  • Ostatnio:8 dni
  • Postów:75
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.

VO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:53
0

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)