Zadanie z SQL
willy - 02-01-2007 01:26
Zadanie z SQL
Witam
Mam tablę opisującą pracowników. W id_szefa podany jest ID_PRAC osoby będącej szefem
PRAC ID_PRAC Number(4) Klucz podstawowy NAZWISKO Varchar2(15) Atrybut obowiązkowy ETAT Varchar2(10) Referencja do atrybutu NAZWA relacji ETAT ID_SZEFA Number(4) Referencja do atrybutu ID_PRAC relacji PRAC ZATRUDNIONY date PLACA_POD Number(6,2) wartość większa od 100 PLACA_DOD Number(6,2) domyślna wartość 0 ID_ZESP Number(2) Referencja do atrybutu ID_ZESP relacji ZESP
Może ktoś mi podpowie jak napisać selecta który wyświetlałby id_prac, nazwisko pracownika, oraz nazwisko szefa. Nie umiem sobie poradzić z wyświetleniem obu nazwisk za jednym razmem
I drugie pytanie. Jeśli wyświetlam pracowników posortowanych według rosnącego id_szefa osoby które nie mają przypisanego szefa (id_szefa is NULL) wyświetlane są na końcu, jak zrobić żeby wyświetliły się na początku
Dopiero zaczynam zabawę z SQL więc proszę możliwie przystepnie
Pozdrawiam -willy-
Marcin - 02-01-2007 01:26
willy napisał(a): > Witam > > Mam tablę opisującą pracowników. W id_szefa podany jest ID_PRAC > osoby będącej szefem > > PRAC > ID_PRAC Number(4) Klucz podstawowy > NAZWISKO Varchar2(15) Atrybut obowiązkowy > ETAT Varchar2(10) Referencja do atrybutu NAZWA relacji ETAT > ID_SZEFA Number(4) Referencja do atrybutu ID_PRAC relacji PRAC > ZATRUDNIONY date > PLACA_POD Number(6,2) wartość większa od 100 > PLACA_DOD Number(6,2) domyślna wartość 0 > ID_ZESP Number(2) Referencja do atrybutu ID_ZESP relacji ZESP > > > Może ktoś mi podpowie jak napisać selecta który wyświetlałby > id_prac, nazwisko pracownika, oraz nazwisko szefa. Nie umiem sobie > poradzić z wyświetleniem obu nazwisk za jednym razmem > > I drugie pytanie. Jeśli wyświetlam pracowników posortowanych według > rosnącego id_szefa osoby które nie mają przypisanego szefa (id_szefa > is NULL) wyświetlane są na końcu, jak zrobić żeby wyświetliły > się na początku > > Dopiero zaczynam zabawę z SQL więc proszę możliwie przystepnie > > Pozdrawiam > -willy- >
Witam,
Zakładam, że baza to ORACLE (sądząc po typie VARCHAR2), więc od razu napiszę pod tę bazę.
Jeśli chodzi o pierwsze pytanie
select p1.ID_PRAC Id_prac , p1.NAZWISKO "Nazwisko pracownika" , p2.NAZWISKO "Nazwisko szefa" from PRAC p1 , PRAC p2 where p1.ID_SZEFA = p2.ID_PRAC (+) /* złączenie typu left foin - żeby wyświetlić również pracowników bez przypisanego szefa*/
Drugie pytanie: .... order by NVL(ID_SZEFA, 0) ASC
NVL(ID_SZEFA, 0) - zwróci 0 jeśli ID_SZEFA będzie NULLem, czyli takie rekordy powinny być zwrócone na początku
Pozdrawiam, Marcin
willy - 02-01-2007 01:26
Faktycznie chodzi o ORACLA. Bardzo dziękuję za pomoc. Mam jeszcze kilka pytań dotyczacych tematu
1. Mam wyświetlić nazwisko osób zarabiających więcej niż Pan "MABACKI" z użyciem podzapytania oraz bez urzycia podzapytania. Z urzyciem podzapytania wygląda to tak :
select nazwisko, placa_pod from prac where placa_pod>(select placa_pod from prac where nazwisko = 'MABACKI');
bez użycia podzapytania niestety nie wiem
2. Wyświetlić nazwiska i płace podstawowe pracowników. Jeżeli płaca podstawowa jest mniejsza od 1480 wyświetlić tekst: 'poniżej 1480', jeśli jest równa, wyświetlić ,,1480" jeśli jest większa, wyświetlić 'powyżej 1480'.
Wiem jak zrobić wszystko poza wyświetleniem tekstu 'poniżej 1480', '1480', 'powyżej '1480'
-willy-
Marcin - 02-01-2007 01:26
willy napisał(a): > Faktycznie chodzi o ORACLA. Bardzo dziękuję za pomoc. Mam jeszcze > kilka pytań dotyczacych tematu > > 1. Mam wyświetlić nazwisko osób zarabiających więcej niż Pan > "MABACKI" z użyciem podzapytania oraz bez urzycia podzapytania. Z > urzyciem podzapytania wygląda to tak : > > select nazwisko, placa_pod from prac where placa_pod>(select placa_pod > from prac where nazwisko = 'MABACKI'); > > bez użycia podzapytania niestety nie wiem > > 2. Wyświetlić nazwiska i płace podstawowe pracowników. Jeżeli > płaca podstawowa jest mniejsza od 1480 wyświetlić tekst: 'poniżej > 1480', jeśli jest równa, wyświetlić ,,1480" jeśli jest > większa, wyświetlić 'powyżej 1480'. > > Wiem jak zrobić wszystko poza wyświetleniem tekstu 'poniżej 1480', > '1480', 'powyżej '1480' > > -willy- >
1. Może tak?
select p2.nazwisko , p2.placa_pod from prac p1 , prac p2 where p1.nazwisko = 'MABACKI' and p2.placa_pod > p1.placa_pod
takie złączenie nazywa się chyba non equi join.
Uwaga! jeśli jest kilku pracowników o nazwisku MABACKI, to wiersze w wyniku zapytania będą się powtarzać (ale wówczas twoje zapytanie wysypie się z błędem ORA-01422)
2. Ja bym zrobił tak:
select p.nazwisko , p.placa_pod , case when p.placa_pod < 1480 then 'poniżej 1480' when p.placa_pod > 1480 then 'powyżej 1480' else '1480' end case tekst from prac p
Marcin - 02-01-2007 01:26
> select p.nazwisko > , p.placa_pod > , case > when p.placa_pod < 1480 then 'poniżej 1480' > when p.placa_pod > 1480 then 'powyżej 1480' > else '1480' > end case tekst > from prac p
Nie jestem pewny składni CASE. Nie mam teraz jak sprawdzić, ale jeśli w powyższym zapytaniu będzie błąd, to powinno być chyba tak:
select p.nazwisko , p.placa_pod , case when p.placa_pod < 1480 then 'poniżej 1480' when p.placa_pod > 1480 then 'powyżej 1480' else '1480' end tekst from prac p
willy - 02-01-2007 01:26
Druga wersja działa poprawnie. Jeszcze raz dziękuje za pomoc
Pozdrawiam -willy-
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plradioaktywni.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|