Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » Martens 04:21
 » selves 03:38
 » Bonifacyz 03:06
 » piszczyk 01:43
 » Chavez 01:26
 » Chrisu 01:25
 » metacom 01:21
 » BoloX 01:16
 » Dzban 01:02
 » Qjanusz 00:53
 » Irys 00:51
 » ulan 00:41
 » RaPToRR 00:22
 » zibi13 00:10

 Dzisiaj przeczytano
 36894 postów,
 wczoraj 25433

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2025
A R C H I W A L N A   W I A D O M O Ś Ć
    

do szpecow od SQL-a , pare zadan - dlugie , Chucky 15/10/04 21:27
mam kilka zadan z sql na standardowej bazie oracle-a, wersja 9.2.0.1.0 zdaje sie i mam troche problemow
Zadanie 1
Napisz zapytanie, generujące listę pracowników (nazwiska).
Gwiazdką z lewej strony oznacz ostatnio zatrudnionego - w pozostałych przypadkach wpisz spację.

SELECT decode(HIREDATE,H.D,'*',' ')||E.ENAME
FROM EMP E, (SELECT max(HIREDATE) D FROM EMP) H

i chodzi tu o ta spacje, nie moge wymusic wyspacjowania nazwisk, czyzby cos sie zmienilo w funkcjach, i oznaczaniu spacji? na starszych wersjach chodzi... a musze dzialac na tej wersji

Zadanie 2
Znajdź pracowników (nazwisko, pensję) zarabiających minimalną pensję na ich stanowiskach pracy. Uporządkuj ich według wzrastających zarobków.

SELECT ENAME,SAL
FROM EMP E,(SELECT JOB J,min(SAL) S FROM EMP GROUP BY JOB) D
WHERE E.SAL=D.S AND E.JOB=D.J
ORDER BY SAL ASC

niby chodzi ok ale gosciu sie czepia ze powinno byc inaczej, ktos ma na to pomysl?(podobnie z maksymalna pensja)

Zadanie 3
Napisz zapytanie pokazujący nazwisko o obliczoną długość czasu zatrudnienia pracowników w miesiącach. (Pamiętaj, że czas zatrudnienia mierzy się w pełnych dniach).

SELECT ENAME,trunc(months_between(sysdate,hiredate))
FROM EMP

identycznie-nie wiem czemu!!

Zadanie 4
Spowoduj wybranie następujących danych (dane mają być wyrównane do obu marginesów):

EMPLOYEE_AND_JOB
----------------------
KING PRESIDENT
BLAKE MANAGER

SELECT rpad(rtrim(ENAME),30-length(rtrim(JOB)),' ')||rtrim(JOB) "Employee_and_job"
FROM EMP

tez nie chca mi sie spacje pojawic- help

Zadanie 5
Wskaż trzech najlepiej zarabiających pracowników w firmie. podaj ich nazwiska i pensje. Wyniki posortuj podając najpierw najlepiej zarabiających. Jeśli kilku pracowników zarabia tyle samo, mają być wyświetleni.

A tego nie wiem z ktorej strony ugryzc

prosze o pomoc w powyzszych zadaniach
bede bardzo wdzieczny

pozdrawiam
ErniK vel Chucky

p.s. do testowania uzywam isqlplus w wersji 9.2.0.1.0 -(wiec baza chyba tez ta wersja)

Corei5 9600K, Z390 PRO, 2x16 Vengeance
3200Mhz, GTX 2060 Super, Seasonic X-650

  1. szpecem nie jestem, ale moze cos pomoge , bwana 15/10/04 22:55
    ad 1) wsio w porzadku w zapytaniu, wiec jedyne co mozna podejrzewac to to, ze klient usuwa z wyniku biale znaki (robi cos w rodzaju trim), sprawdz, jak bedzie wygladal wynik dla

    SELECT decode(HIREDATE,H.D,'*','1 ')||E.ENAME
    ...
    oczywiscie zamiast '1' moze byc cokolwiek, co nie jest bialym znakiem. Sprawdz, jak oryginalne query odpowiada w innym kliencie niz uzywales do tej pory.

    na bazie 10g i SQLNav, Toadzie i SQLPlusie sprawdzilem i jest Ok, wiec byc moze to kwestia konfiguracji iSQLPlusa (ktorego nie uzywam i nie znam)

    ad 2)

    select ename, sal from emp a
    where sal = (select min (sal) from emp b where a.job=b.job)
    order by 2 asc

    takie zapytanie nie powoduje generowania produktu emp^2 wiec w pewnych okolicznosciach moze byc
    wydajniejsze


    ad 3) Pracownik moze miec wiele okresow zatrudnienia, wiec moze wlasnie o to chodzi "gosciowi":

    SELECT max(ENAME),sum(trunc(months_between(nvl(firedate,sysdate),hiredate)))
    FROM EMP
    group by ENAME

    tu oczywiscie zakladam ze ENAME, czyli nazwisko jest unikalnym identyfikatorem danego pracownika w tabeli emp. Firedate to data zwolnienia.


    ad 5)

    trzeba okreslic zbior 3 najwyzszych pensji wsrod pracownikow i jest to

    select sal from (
    select sal from emp
    order by sal desc)
    where rownum <=3

    i teraz wybrac pracownikow ktorzy maja takie wlasnie wynagrodzenie, czyli

    select ename, sal from emp
    where sal in
    (
    -- i tu wklejamy powyzsze
    select sal from (
    select distinct sal from emp
    order by sal desc)
    where rownum <=3
    )
    order by sal desc

    wsio


    podsumowujac, jest to troche wrozenie z fusow, bo jedynie domyslam sie, jaki jest model danych, ktore probujesz odpytywac. no ale moze pomoze.

    PS. Wersja isqlplusa nie swiadczy o wersji bazy, tym sie nie sugeruj.

    "you don't need your smile when I cut
    your throat"

    1. uwaga, w moj post wkradla sie niescislosc , bwana 15/10/04 22:58
      w ad 5) pisze najpierw

      select sal from (
      select sal from emp
      order by sal desc)
      where rownum <=3


      a potem to samo, tylko z DISTINCT. Oczywiscie DISTINCT mialo byc w obu miejscach. W przeciwnym wypadku otrzymalibysmy 3 najwyzsze wynagrodzenia, a nie 3 najwyzsze ROZNE od siebie wynagrodzenia. Ma byc distinct:-D

      "you don't need your smile when I cut
      your throat"

      1. WIELKIE THX , Chucky 16/10/04 11:23
        J/W...
        PIFQO

        Corei5 9600K, Z390 PRO, 2x16 Vengeance
        3200Mhz, GTX 2060 Super, Seasonic X-650

  2. Piąteczka , pachura 15/10/04 22:59
    Pomógłbym Tobie, ale niestety nie wiem jak wygląda standardowa baza Oracle'a, jakie są pola tabel i powiązania między nimi. Sorry ;)

    Piąteczka:

    select
    ename,
    sal
    from
    emp
    where
    sal >
    (
    select
    sal
    from
    (
    select distinct
    sal
    from
    emp
    order by
    sal desc
    )
    where
    rownum = 4
    )
    order by
    sal desc;



    Zewnętrzne zapytanie:
    - wybierz pracowników o gaży większej niż podzapytanie, posortuj malejąco.

    Pierwsze podzapytanie:
    - wybierz czwarty z kolei wiersz drugiego podzapytania.

    Drugie podzapytanie:
    - wybierz unikalne (DISTINCT) gaże pracowników, posortuj je malejąco.

    Także jeśli w bazie będą pracownicy o gażach 5 5 4 4 3 3 2 1, to wypisze się: 5 5 4 4 3 3 (pierwsze podzapytanie zwróci 2, drugie - 5 4 3 2 1).

    1. O! Zrobiles to lepiej, bo uniknales zapytania o zbior (IN) , bwana 15/10/04 23:03
      zastepujac je pojedyncza wartoscia - istotnie, piateczka:-D

      "you don't need your smile when I cut
      your throat"

    2. musi byc , Chucky 16/10/04 11:54
      rownum<4, a nie '=', no i bez 'IN' nie przejdzie, BWANA mial racje

      Corei5 9600K, Z390 PRO, 2x16 Vengeance
      3200Mhz, GTX 2060 Super, Seasonic X-650

      1. nienienie, oba query zwracaja poprawne wyniki , bwana 16/10/04 14:26
        a z punktu widzenia wydajnosci minimalnie lepsze jest to, ktore zaproponowal pachura.

        Zauwaz ze pachura wybiera czwarta w rankingu pensje z tabeli i zwraca pracownikow o pensjach wiekszych niz ta czwarta w rankingu, natomiast ja wybieram pierwsze trzy w rankingu pensje i wybieram pracownikow, ktorych pensje sa rowne jednemu z trzech elementow "zbioru" utworzonego podzapytaniem. Oba sposoby sa rownowazne, przy czym, jesli mamy rozwazac aspekt "konkursowy", to uwazam, ze query pachury jest lepsze, choc tylko minimalnie lepsze:-D

        gdyby jednak celem bylo wybranie pracownikow o 100000 najwyzszych wynagrodzen, to pachurowe query byloby juz nie minimalnie, a sporo wydajniejsze - zauwaz, ze przy kazdym sprawdzeniu kazdego pracownika, trzeba byloby przeszukac zbior 100000 elementow, gdyby zastosowac moje rozwiazanie. Natomiast w przypadku zapytania kolegi nadal byloby to porownanie z tylko jedna wartoscia (czyli 100001 pensja w rankingu). Slowem - zapytanie pachury jest bardziej hem... skalowalne - to chyba wlasciwe slowo.

        "you don't need your smile when I cut
        your throat"

        1. a kontynuujac konkursowe zapedy, oto moj challenge: , bwana 16/10/04 14:35
          mamy tabele ABSENCJE w ktorej kolejne kolumny to PRAC_ID, ABS_START_DATE, ABS_END_DATE, wypelniona informacjami o absencjach pracownikow - data poczatkowa i koncowa oraz klucz obcy do tabeli z informacjami o pracownikach (imie nazwisko, blabla) ktora to tabele dla uproszczenia olewamy (pardon my french).

          Zadanie jest proste - sporzadzic wykaz ciaglych absencji pracownikow, przy czym absencja ciagla to taka, ktora sklada sie z 1 lub wiecej absencji zapisanych w tabeli ABSENCJE, slowem dla:

          1;2001-01-01;2001-01-23
          1;2001-01-24;2001-01-27
          1;2001-01-29;2001-02-12

          w wyniku mamy uzyskac:
          1;2001-01-01;2001-01-29
          1;2001-01-29;2001-02-12

          zagadnienie ciaglosci okresow czasu jest dosc typowe np. dla systemow kadrowo-placowych, stad tez i pomysl na owo wyzwanie.

          "you don't need your smile when I cut
          your throat"

        2. Jednak moje query jest do dupy... , pachura 16/10/04 15:18
          Bo gdy w tabeli EMP będzie mniej niż 4 unikalnych wartości płac (np. 1 1 1 2 3 3), to pierwsze podzapytanie nie będzie mogło wybrać czwartego wiersza drugiego podzapytania - po prostu go nie będzie...

          Rozwiązaniem jest dodanie na zewnątrz pierwszego podzapytania NVL((podzapytanie), 0) - wówczas przy braku czwartego wiersza zwróci zero - i warunek sal > 0 zadziała.

          Dwa - nie bój się zapytań z IN - Oracle ładnie je optymalizuje i często chodzą lepiej niż takie z EXIST czy zwykłym łączeniem.

          1. Sluszna uwaga, nvl zalatwi sprawe tak jak napisales , bwana 16/10/04 20:20
            jesli chodzi o podzapytania w ogolnosci to najwazniejszym czynnikiem decydujacym o wydajnosci jest to, czy podzbior IN/EXISTS jest zalezny czy niezalezny od biezacego wiersza zapytania nadrzednego. W naszym przykladzie nie jest, ale wyobrazmy sobie taka oto sytuacje:

            select * from emp a where salary in (select ... salary... from emp b where a.job = b.job)

            tutaj podzapytanie jest obliczane w najgorszym przypadku nawet tyle razy, ile jest wierszy w tabeli emp.

            Jak juz wspomnialem, w naszym podzapytaniu taka sytuacja nie nastapi, jednak jesli nawet ten jednokrotnie obliczony zbior wartosci jest liczny, to:

            - przeszukiwanie go przy kazdym wierszu tabeli emp trwa dluzej niz porownanie wartosci w kazdym wierszu z wartoscia obliczona Twoim sposobem, nawet jesli optymalizator zorganizuje go w powiedzmy drzewo binarne,

            -utrzymywanie zbioru w pamieci sesji lub w tempie przez caly czas trwania tworzenia wyniku obciazyc moze system - zalozmy, ze takie zapytanie znajduje sie w raporcie, ktory jest jednoczesnie (potencjalnie) uruchamiany przez fyfnascie sesji

            slowem - do okreslenia warunku potrzebujemy jednej liczby (czyli wynagrodzenia 4 czy tez n-tego w rankingu) i nie ma sensu w tym konkretnym przypadku przechowywanie 3 czy n-1 elementow.

            Wracajac do Twojej korekty - oczywiscie zamiast NVL mozna np. ustalic warunek rownum <4 a w zewnetrznym selekcie zamiast sal wybrac min(sal). Slowem - mozna na wiele sposobow i "pan od SQL-a" Chucky'ego powinien takze to zrozumiec;-D

            "you don't need your smile when I cut
            your throat"

            1. nie znacie goscia , Chucky 16/10/04 23:01
              czepia sie wszystkiego!!
              oszolom^2.... ;)

              Corei5 9600K, Z390 PRO, 2x16 Vengeance
              3200Mhz, GTX 2060 Super, Seasonic X-650

              1. niii, to my jestesmy oszolomy , bwana 16/10/04 23:20
                tyle stron z pornografia w sieci, a my analizujemy jakies sql-e;-D

                "you don't need your smile when I cut
                your throat"

    
All rights reserved ® Copyright and Design 2001-2025, TwojePC.PL