Persona(CF, Nome, Cognome, DataNascita) Città(Id, Nome, NumeroAbitanti) Ditta(PIVA, NumeroImpiegati, CapitaleSociale) HaAbitato(CFPersona, IdCittà, DaAnno, AAnno) HaLavorato(CFPersona, PIVADitta, DaAnno, AAnno) HaAvutoSede(PIVADitta, IdCittà, DaAnno, AAnno)
Identificare le chiavi esterne presenti nello schema indicando per ognuna di esse relazione referente e riferita
Creare la tabella HaLavorato specificando gli opportuni vinoli di integrità e le opzioni per gestire l’integrità referenziale (motivando le scelte effettuate per la gestione dell’integrità referenziale)
CREATE TABLE HaLavorato(
CFPersona VARCHAR(16) REFERENCES Persona
ON DELETE CASCADE
ON UPDATE CASCADE,
PIVADitta VARCHAR(11) REFERENCES Ditta
ON UPDATE CASCADE,
DaAnno DECIMAL(4),
AAnno DECIMAL(4),
PRIMARY KEY (CFPersona, PIVADitta)
);
Aumentare del 10% il capitale sociale delle ditte che hanno o hanno avuto sede a Milano.
UPDATE Ditta SET CapitaleSociale = CapitaleSociale * 1.1
WHERE PIVA IN(
SELECT PIVADitta
FROM HaAvutoSede JOIN Città ON (IdCittà = Id)
WHERE Nome = 'Milano'
);
Aggiungere alla tabella Città l’attributo Regione
ALTER TABLE Città ADD COLUMN Regione VARCHAR(20);
Il codice fiscale delle persone che hanno lavorato almeno una volta in una città in cui abitano o hanno abitato
SELECT CFPersona
FROM HaAbitato A JOIN HaLavorato USING(CFPersona)
JOIN HaAvutoSede S USING(PIVADitta)
WHERE A.IdCittà = S.IdCittà;
La partita Iva delle ditte che hanno (o hanno avuto) sedi in tutte le città
SELECT PIVADitta FROM HaAvutoSede
GROUP BY PIVADitta
HAVING COUNT(IdCittà) = (
SELECT COUNT(*) FROM Città
);
Per le persone che hanno lavorato in almeno 4 città diverse, il loro CF ed il numero di anni complessivi di lavoro
SELECT CFPersona, SUM(AAnno - DaAnno)
FROM HaLavorato JOIN HaAvutoSede USING(PIVADitta)
GROUP BY CFPersona
HAVING COUNT(DISTINCT IdCittà) >= 4
Il nome e cognome delle persone nate dopo il 1990 che non hanno mai lavorato in una ditta con numero di impiegati maggiore di 30
SELECT Nome, Cognome FROM Persona WHERE EXTRACT(YEAR FROM DataNascita) > 1990 AND CF NOT IN(
SELECT CFPersona
FROM HaLavorato JOIN Ditta ON(PIVADitta = PIVA)
WHERE NumeroImpiegati > 30
)
Per ogni anno e per ogni identificatore di città, il numero di persone che hanno iniziato ad abitare in quella città in quell’anno (ad esempio 2009, 123, numero di persone che hanno iniziato ad abitare nella città con id 123 nel 2009)
SELECT DaAnno, IdCittà, COUNT(*)
FROM HaAbitato
GROUP BY DaAnno, IdCittà
Si consideri lo schema ER di seguito rappresentato, dove la gerarchia di generalizzazione è parziale/esclusiva
Si richiede di:
Produrre uno schema ER ristrutturato, giustificando le scelte effettuate, ove più opzioni siano possibili per la ristrutturazione. Elencare in linguaggio naturale gli eventuali vincoli derivanti dalla ristrutturazione.
Vincoli: se una istanza di E1 partecipa ad A4 non può partecipare ad A5 e viceversa
Tradurre lo schema ER ottenuto al punto 1 in uno schema logico equivalente indicando, per ogni relazione, chiavi, chiavi esterne e vincoli di obbligatorietà