• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

select przy kluczu obcym w tej samej tabeli - "związek rekursywny"

Object Storage Arubacloud
0 głosów
330 wizyt
pytanie zadane 3 maja 2021 w SQL, bazy danych przez Grzybel Nowicjusz (150 p.)

Mam zadania z baz danych i nie mogę zrobić jednego z ćwiczenia. Już 2 dni się głowie jak je zrobić i dalej nic mi nie wychodzi i dodatkowo nigdzie nie mogę znaleźć nic na ten temat.

Struktura tabeli wygląda tak:

create table pracownik(
numer int,
nazwisko varchar(20) not null,
etat varchar(10),
szef int references pracownik(numer),
pracuje_od date default '2007-10-01',
placa_pod decimal(6,2),
placa_dod decimal(6,2),
id_zesp smallint,
constraint pk_pracownik primary key(numer),
constraint pracownik_etat_fkey foreign key (etat) references etat(nazwa),
constraint pracownik_zespol_fkey foreign key (id_zesp) references zespol(id_zesp)
);

, a polecenie brzmi:
"Wyświetlić numery i nazwiska pracowników i ich przełożonych.
Wyświetlić również pracowników, którzy nie mają przełożonych. Wyniki uporządkować zgodnie z rosnącym porządkiem alfabetycznym nazwisk przełożonych."
Nie wiem czy tak to ma wyglądać, ale chciałbym uzyskać taki efekt, że wyświetla się:
numer pracownika, nazwisko pracownika, numer przełożonego i nazwisko przełożonego.

Jakby ktoś znał odpowiedź jak to zrobić to byłbym pocieszony jakby wyjaśnił co i jak, bo wydaje się to być całkiem przydatne. Jeśli gdzieś już takie pytanie padło to prosiłbym o link.


 


 

 

1 odpowiedź

+1 głos
odpowiedź 3 maja 2021 przez Arkadiusz Waluk Ekspert (287,950 p.)
wybrane 3 maja 2021 przez Grzybel
 
Najlepsza
Spójrz na coś takiego jak JOINy, tu LEFT JOIN powinien pasować. Chyba że to jakieś zadanie do szkoły i jeszcze ich nie miałeś/nie możesz/nie chcesz używać, to zagnieżdżony SELECT też powinien dać radę.
komentarz 3 maja 2021 przez Grzybel Nowicjusz (150 p.)

Właśnie nie wiem jak to zrobić za pomocą joinów, a zagnieżdżonych selectów jeszcze się nie uczyłem, ale skoro mówisz, że powinno to zadziałać to zaraz spróbuje je ogarnąć.
Joinem próbowałem tak:

select numer, szef, nazwisko from pracownik left join pracownik on pracownik.szef = pracownik.numer;

.

 

komentarz 3 maja 2021 przez Arkadiusz Waluk Ekspert (287,950 p.)

Dobrze kombinujesz, ale w tej wersji masz powielone nazwy - Twoja tabela to pracownicy i dołączana tabela to też pracownicy, więc będzie konflikt nazw. Wypadałoby tu użyć aliasu (as) dla jednej albo i obydwu.

Następnie tutaj: on pracownik.szef = pracownik.numer; też trzeba dodać użycie tego aliasu tabeli przy jednej wartości, bo obecnie baza nie będzie wiedziała, które rekordy z czym powiązać - w sensie, która tabela to jest ta podstawowa, a którą dołączasz dodatkowo. To samo przy nazwach kolumn do wyciągnięcia: select numer, szef, nazwisko - obecnie, bez wskazanych nazw/aliasów tabel, baza nie będzie wiedziała, z której ma coś wyciągnąć. No i do tego potrzebujesz wyciągnąć z obydwu - bo i dla pracownika (czyli tej podstawowej) i dla szefa (czyli dołączanej).

1
komentarz 3 maja 2021 przez Grzybel Nowicjusz (150 p.)

Aż nie wierzę, że ktoś na forum mi tak dobrze wyjaśnił i jeszcze mnie nie powyzywał. Dziękuje ci bardzo. Bardzo dobrze wyjaśnione i jeszcze, zamiast dawać mi po prostu gotowca to właśnie wyjaśniłeś jestem ci bardzo wdzięczny. smileyyes Teraz nie wiem czy zamieszczać kod z rozwiązaniem, bo może twój komentarz też mu pomoże, a tak się nawet nie zastanowi.

komentarz 3 maja 2021 przez Arkadiusz Waluk Ekspert (287,950 p.)
Cieszę się, że pomogłem. Co do gotowców to generalnie na forum staramy się preferować nakierowanie i pomoc, a nie odwalenie zadania za kogoś - bo to ma największy sens. Na to samo liczymy od drugiej strony, tzn. że pytający będą przychodzili po pomoc, a nie zrobienie za nich. Praktyka pokazuje, że bywa różnie, szczególnie z tej drugiej strony, no ale cóż :)

Jeśli chodzi o wstawianie rozwiązania - jeżeli uważasz, że mój komentarz to dobrze wyjaśnia, to myślę, że nie ma potrzeby, aby to robić. Jednak tak naprawdę jeśli ktoś będzie chciał znaleźć gotowy kod na coś, to prawdopodobnie go znajdzie - w internecie jest pełno różnych przykładów, pytań, serwisów z odpowiedziami czy nawet po prostu celowo różnego rodzaju kod jest publikowany na GitHubie czy to jako przykład rozwiązania czy normalnie z oprogramowania opensource. Tym bardziej, że to zadanie jest jednak dość małe i sprowadza się do jednego zapytania.

Podobne pytania

0 głosów
1 odpowiedź 77 wizyt
0 głosów
1 odpowiedź 521 wizyt
pytanie zadane 30 października 2018 w SQL, bazy danych przez GhostZoombie Użytkownik (640 p.)
0 głosów
1 odpowiedź 2,995 wizyt

92,555 zapytań

141,402 odpowiedzi

319,541 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...