Prośba o pomoc w skonstruowaniu zapytania SELECT

0

Mam bazę danych Oracle a w niej 2 tabele: Emp i Dept (screen zamieszczony w załączniku).

Kolumna Dept.Deptno jest kluczem głównym - kolumna Emp.Deptno to klucz obcy.

2 zadania:

  1. Ustaw w pary pracowników, którzy pracują w tym samym dziale. Nazwiska w parze powinny być różne i pary nie powinny się powtarzać.

  2. Dla każdego działu wyznacz nazwisko pracownika pojawiające się jako pierwsze w porządku alfabetycznym.

W zadaniu 7 próbowałem najpierw pogrupować pracowników według działów w których pracują (GROUP BY Dept.Deptno) a następnie użyć podzapytania które wyciągnie jednego pracownika spełniającego warunki w zadaniu.

W zadaniu 6 za pomocą różnych aliasów nadaych dla tabeli Emp za pomocą instrukcji UNION próbowałem ustawić ich obok siebie - też spełzło na niczym : P

Generalnie próbowałem zapytań grupowych, sumarycznych, podzapytań ze złączeniami tabel i bez.

Mógłby mnie ktoś nakierować jakich instrukcji powinienem użyć żeby żeby rozwiązać te 2 zadanka? Ewentualnie podesłać gotowca którego już tam po swojemu przeanalizuje i dojdę co i jak : P

0

Do zadania 7 zrobiłem coś takiego:

SELECT d.Deptno, e.Ename FROM Emp e JOIN Dept d ON d.Deptno = e.Deptno
WHERE e.Ename = (SELECT * FROM (SELECT f.Ename FROM Emp f ORDER BY f.Ename) WHERE ROWNUM <= 1); 

To zapytanie wyświetla mi jedno nazwisko i odpowiadający mu dział. Chciałbym żeby dla każdego działu wypisało po jednym nazwisku spełniającym warunki. Po dodaniu GROUP BY d.Deptno otrzymuje błąd: "not a GROUP BY expression". Ktoś coś? :>

1

Co do zadania 7 to aż się prosi użycie https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions043.htm do wyciągnięcia "rangi" danego pracownika i w warunku where dajesz sobie pole_rank = 1 dzięki temu zwróci ci tylko 1 gościa dla danego działu.

Co do 6 to nie bardzo łapię co chcesz uzyskać. Możesz to zobrazować jakoś na przykładzie?

0

W ten sposób wyciągnąłem pierwszy wiersz ale nie wiedziałem jak to później wykonać dla każdej grupy z osobna.

SQL> SELECT * FROM
  2  (SELECT e.Ename, d.Deptno, dense_rank() over (ORDER BY e.Ename) rnk FROM Emp e JOIN Dept d ON e.Deptno = d.Deptno G
ROUP BY d.Deptno, e.Ename)
  3  WHERE rnk = 1;

udało się nieco prościej

 SELECT d.Deptno, Min(e.Ename) FROM Emp e JOIN Dept d ON e.Deptno = d.Deptno GROUP BY d.Deptno; 

EDIT: a nawet tak : D

SELECT DISTINCT e.Deptno, Min(e.Ename) FROM Emp e GROUP BY e.Deptno;

`
Co do 6 to też zastanawiam się jak by to miało wyglądać. Może coś takiego(załącznik) ale bez duplikatów a jeśli nie ma pary to NULL ; >

1

Zadanie 7.
Pierwsze w porządku alfabetycznym, czyli minimalne. Czyli możesz zastosować bardzo proste zapytanie:

SELECT DEPTNO, Min(ENAME) FROM Emp GROUP BY DEPTNO
2

Zadanie 6.
Łączysz dwa razy tę samą tabelę ze sobą, ale opdrzucasz samych siebie...

SELECT e1.Ename, e2.Ename FROM Emp e1 JOIN Emp e2 ON e1.DEPTNPO=e2.DEPTNO and e1.empno<>e2.empno

Ładnie, ale otrzymasz jeszcze pary:
Kowalski Clark
Clark Kowalski
A tego też chcesz się pozbyć... Czyli wystarczy że w warunku powyżej zmienisz e1.empno<>e2.empno na e1.empno>e2.empno

0

Udało się, dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1