|
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 - 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" - 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" - WIELKIE THX , Chucky 16/10/04 11:23
J/W...
PIFQOCorei5 9600K, Z390 PRO, 2x16 Vengeance
3200Mhz, GTX 2060 Super, Seasonic X-650
- 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).- 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" - musi byc , Chucky 16/10/04 11:54
rownum<4, a nie '=', no i bez 'IN' nie przejdzie, BWANA mial racjeCorei5 9600K, Z390 PRO, 2x16 Vengeance
3200Mhz, GTX 2060 Super, Seasonic X-650 - 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" - 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" - 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.- 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" - 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 - 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 |
 |
|
|
|