Proszę o pomoc w stworzeniu prawidłowego zapytania.- ORACLE SQL

0

Baza danych ma następujący schemat:

Dept(NumDz,NazwaDz,NumKier)
Prac(NumP,Nazw,Imię,DataUr,DataZatr,NumDz,Zarob,Piętro)
Pracuje(NumP,NumProj,Rola)
Projekty(NumProj,NazwaProj,Budżet)

(Atrybuty NumP, NumDz, NumKier, Piętro, NumProj, Zarob i Budżet są numeryczne, DataUr i DataZatr - datowe, pozostałe - napisowe).

  1. Wypisz nazwiska wszystkich pracowników, którzy pracują w tym samym projekcie w dwóch różnych rolach lub w tej samej roli w dwóch różnych projektach.
SELECT *
 FROM PRACUJE pr
 WHERE pr.NUMP IN (
     SELECT pr.NUMP
     FROM PRACUJE pr
     WHERE pr.NUMPROJ IN (
         SELECT pr.NUMPROJ
         FROM PRACUJE pr
         GROUP BY pr.NUMPROJ
         HAVING COUNT(pr.NUMP) > 1
     )
     GROUP BY pr.NUMP
     HAVING COUNT(*) > 1
 );

Wynik musi wyświetlać nazwiska - nie wiem jak to zrobić.
NUMP|NUMPROJ|ROLA|
----+-------+----+
101| 119|Kier|
102| 121|Kier|
101| 125|Mark|
102| 127|Kier|
102| 119|Mark|
101| 121|Prog|
101| 123|Kier|
101| 127|Mark|
3. Sprawdź, czy w firmie w tym samym projekcie pracują dwie różne osoby o tym samym imieniu.

SELECT *
 FROM PRAC p JOIN PRACUJE pr ON p.NUMP = pr.NUMP
 WHERE p.IMIE IN (
     SELECT p.IMIE
     FROM PRAC p
     GROUP BY p.IMIE
     HAVING COUNT(DISTINCT p.NAZW) > 1
 )
 GROUP BY p.IMIE, p.NAZW, p.NUMP, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO, pr.NUMP, NUMPROJ, ROLA
 HAVING COUNT(pr.NUMP) > COUNT(DISTINCT pr.NUMP);

NUMP|NAZW|IMIE|DATAUR|DATAZATR|NUMDZ|ZAROBKI|PIETRO|NUMP|NUMPROJ|ROLA|
----+----+----+------+--------+-----+-------+------+----+-------+----+
????
Z góry dziękuje za wszelką pomoc.
Pozdrawiam

1

Wynik musi wyświetlać nazwiska - nie wiem jak to zrobić.

Zrób JOINa z tabelą pracownicy: JOIN prac p ON p.NumP = pr.NumP czy coś takiego.

Sprawdź, czy w firmie w tym samym projekcie pracują dwie różne osoby o tym samym imieniu.

Tak na szybko mi się wydaje, że ostro poleciałeś z tym zapytaniem. Do tabeli projekty dołącz sobie poprzez JOINa tabelę z Pracuje a potem z Prac.

Ogólnie to te zapytania jakieś takie zbyt ubogacone moim zdaniem i da się to prościej. Możesz wrzucić skrypt tworzący bazę z przykładowymi danymi?
Wiesz bez wazeliny bardziej boli ;)

0
-- Table: Dept
CREATE TABLE Deptm (
    NumDz number(3,0)  NOT NULL,
    NazwaDz varchar2(20)  NOT NULL,
    NumKier number(3,0)  NOT NULL,
    CONSTRAINT Dept_pk PRIMARY KEY (NumDz)
) ;

-- Table: Prac
CREATE TABLE Prac (
    NumP number(3,0)  NOT NULL,
    Nazw varchar2(30)  NOT NULL,
    Imie varchar2(20)  NOT NULL,
    DataUr date  NOT NULL,
    DataZatr date  NOT NULL,
    NumDz number(3,0)  NOT NULL,
    Zarobki number(6,2)  NOT NULL,
    Pietro number(3,0)  NOT NULL,
    CONSTRAINT Prac_pk PRIMARY KEY (NumP)
) ;

-- Table: Pracuje
CREATE TABLE Pracuje (
    NumP number(3,0)  NOT NULL,
    NumProj number(6,0)  NOT NULL,
    Rola varchar2(30)  NOT NULL,
    CONSTRAINT Pracuje_pk PRIMARY KEY (NumP,NumProj)
) ;

-- Table: Projekty
CREATE TABLE Projekty (
    NumProj number(6,0)  NOT NULL,
    NazwaProj varchar2(60)  NOT NULL,
    Budzet number(8,2)  NOT NULL,
    CONSTRAINT Projekty_pk PRIMARY KEY (NumProj)
) ;

-- foreign keys
-- Reference: Prac_Dept (table: Prac)
ALTER TABLE Prac ADD CONSTRAINT Prac_Dept
    FOREIGN KEY (NumDz)
    REFERENCES Dept (NumDz);

-- Reference: Prac_Pracuje (table: Pracuje)
ALTER TABLE Pracuje ADD CONSTRAINT Prac_Pracuje
    FOREIGN KEY (NumP)
    REFERENCES Prac (NumP);

-- Reference: Pracuje_Projekty (table: Pracuje)
ALTER TABLE Pracuje ADD CONSTRAINT Pracuje_Projekty
    FOREIGN KEY (NumProj)
    REFERENCES Projekty (NumProj);
0
INSERT INTO DEPTM (NUMDZ, NAZWADZ, NUMKIER) VALUES(120, 'AA', 101);
INSERT INTO DEPTM (NUMDZ, NAZWADZ, NUMKIER) VALUES(121, 'BB', 102);
INSERT INTO DEPTM (NUMDZ, NAZWADZ, NUMKIER) VALUES(122, 'CC', 103);
INSERT INTO DEPTM (NUMDZ, NAZWADZ, NUMKIER) VALUES(133, 'NN', 104);

INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(101, 'Aaaa', 'Zaa', TIMESTAMP '1970-08-19 00:00:00.000000', TIMESTAMP '2010-02-22 00:00:00.000000', 120, 7000, 1);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(102, 'Bbbbb', 'Zbb', TIMESTAMP '1971-07-21 00:00:00.000000', TIMESTAMP '2021-03-18 00:00:00.000000', 120, 6000, 2);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(103, 'Ccccc', 'Zcc', TIMESTAMP '1974-06-16 00:00:00.000000', TIMESTAMP '2020-05-19 00:00:00.000000', 122, 6000, 3);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(104, 'Dddd', 'Zdd', TIMESTAMP '1978-09-15 00:00:00.000000', TIMESTAMP '2019-06-30 00:00:00.000000', 133, 6500, 4);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(105, 'Eeee', 'Zee', TIMESTAMP '1980-12-19 00:00:00.000000', TIMESTAMP '2015-08-15 00:00:00.000000', 133, 5000, 4);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(106, 'Fffff', 'Zff', TIMESTAMP '1982-08-31 00:00:00.000000', TIMESTAMP '2013-09-22 00:00:00.000000', 120, 4500, 3);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(107, 'Ggggg', 'Zgg', TIMESTAMP '1984-01-15 00:00:00.000000', TIMESTAMP '2021-12-22 00:00:00.000000', 121, 4700, 2);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(108, 'Hhhhh', 'Zhh', TIMESTAMP '1985-02-05 00:00:00.000000', TIMESTAMP '2018-11-22 00:00:00.000000', 120, 4900, 1);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(109, 'Iiiii', 'Zaa', TIMESTAMP '1973-04-06 00:00:00.000000', TIMESTAMP '2011-01-22 00:00:00.000000', 120, 5500, 1);
INSERT INTO PRAC (NUMP, NAZW, IMIE, DATAUR, DATAZATR, NUMDZ, ZAROBKI, PIETRO) VALUES(110, 'Jjjjj', 'Zaa', TIMESTAMP '1983-05-13 00:00:00.000000', TIMESTAMP '2013-04-22 00:00:00.000000', 121, 5100, 2);

INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(101, 119, 'Kier');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(102, 121, 'Kier');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(103, 123, 'Kier');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(104, 125, 'Kier');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(105, 119, 'Prog');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(106, 121, 'Prog');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(107, 123, 'Prog');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(108, 125, 'Prog');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(109, 119, 'Prog');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(110, 119, 'Prog');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(101, 125, 'Mark');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(102, 127, 'Kier');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(102, 119, 'Mark');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(101, 121, 'Prog');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(101, 123, 'Kier');
INSERT INTO PRACUJE (NUMP, NUMPROJ, ROLA) VALUES(101, 127, 'Mark');

INSERT INTO PROJEKTY (NUMPROJ, NAZWAPROJ, BUDZET) VALUES(127, 'Pr5', 335000);
INSERT INTO PROJEKTY (NUMPROJ, NAZWAPROJ, BUDZET) VALUES(119, 'Pr1', 15000);
INSERT INTO PROJEKTY (NUMPROJ, NAZWAPROJ, BUDZET) VALUES(121, 'Pr2', 450000);
INSERT INTO PROJEKTY (NUMPROJ, NAZWAPROJ, BUDZET) VALUES(123, 'Pr3', 850000);
INSERT INTO PROJEKTY (NUMPROJ, NAZWAPROJ, BUDZET) VALUES(125, 'Pr4', 122000);
0

Po pierwsze to całe nazewnictwo jest do wymiany, bo teraz jest trudno czytelne.

  • żadnych skrótów, tylko pełne nazwy
  • wszystko z małej litery
  • elementy dwuwyrazowe oddzielone underscore, znak:_
  • nazwy tabel w pierwszej osobie liczby pojedynczej
  • klucz podstawowy zawsze o nazwie id
  • klucze obce to kombinacja nazwy obcej tabeli + id, np. klucz obcy do tabeli "projekt" w innej tabeli powinien się nazywać "projekt_id"

Czyli:

  • zamiast tabela "Projekty" mamy tabelę "projekt"
  • zamiast "NumProj" - co jak zakładam jest kluczem podstawowym, kolumna "id" - i tak w każdej tabeli gdzie jest klucz podstawowy składający się z jednej kolumny
  • zamiast kolumny "DataZatr" powinno byc "data_zatrudnienia"
    i tak dalej wg. zasad powyżej.

Te zasady powodują, że wszystko jest bardziej czytelne, i łatwiej programowalne. Teraz żeby Ci pomóc, to można dostać oczopląsu od tych skrótów i kamelizacji nazw, to nie jest C++ czy Java, tylko baza danych tutaj się liczby przede wszystkim czytelność.

Jeżeli to wszystko ulegnie zmianie, to ja wtedy mogę pomóc, ale przy takiej, za przeproszeniem, kaszanie z nazewnictwem to ja dziękuję.

0

@TomRZ: W zupełności się z Tobą zgadzam, ale tak wygląda zadanie ( jedno z czterech i każde z 10 podpunktami ) narzucone przez wykładowcę
screenshot-20211205164457.png

0

@.andy: Dzięki za chęci ale muszę to oddać dziś do 24:00 Reszta zadań ogarnięta więc jest w miarę ok.

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