Esercizio no.5:soluzione
|
Si identificano delle entità fondamentali come la Città (C)
e i teatri (T).
Ovviamente in ogni città ci possono essere più teatri, mentre
un teatro può stare in una sola città.
Si individua l'entità Spettacoli (S); si potrebbe pensare
di associare Spettacoli - Città con una relazione n-n
|
|
L'associazione n-n si traduce nella relazione Evento (E)
che oltre alle chiavi esterne di C ed S conterrà il campo
data dell'evento.
Questa soluzione mette in evidenza, però, come individuato
un evento in una certa data in una certa città sia impossibile
risalire alla sala teatrale T nel quale tale evento viene
messo in atto.
|
|
L'inversione della posizione fra le entità T e C risolve
questa incongruenza, è ora possibile tentare di impostare
la versione completa del db introducendo un numero minimo
di attributi al fine di testare il tutto.
|
C |
idc |
contatore |
chiave primaria |
nome |
testo |
nome della città |
|
CREATE TABLE C (
idc COUNTER PRIMARY KEY,
nome CHAR(20)); |
S |
ids |
contatore |
chiave primaria |
tit |
testo |
titolo spettacolo |
pre |
numerico |
prezzo del biglietto |
|
CREATE TABLE S (
ids COUNTER PRIMARY KEY,
tit CHAR(20),
pre INTEGER); |
T |
idt |
contatore |
chiave primaria |
nomt |
testo |
nome del teatro |
xidc |
numerico |
intero chiave esterna |
|
CREATE TABLE T (
idt COUNTER PRIMARY KEY,
nomt CHAR(20),
xidc INTEGER REFERENCES (idc)); |
E |
ide |
contatore |
chiave primaria |
data |
data/ora |
data in cifre |
xidt |
numerico |
intero (chiave esterna) |
xids |
numerico |
intero (chiave esterna) |
|
CREATE TABLE E (ide COUNTER
PRIMARY KEY, data date, xids INTEGER REFERENCES S(ids), xidt
INTEGER REFERENCES T(idt)); |
Popoliamo le tabelle con valori di test.
tabella C (città)
|
tabella T (teatro)
|
|
idt |
nomt |
xidc |
1 |
capitol |
1 |
2 |
roxy |
1 |
3 |
centrale |
2 |
4 |
ariston |
2 |
|
tabella S (spettacolo)
|
tabella E (evento)
|
ids |
tit |
pre |
1 |
alpha |
8 |
2 |
beta |
8 |
3 |
gamma |
8 |
4 |
delta |
8 |
5 |
tau |
12 |
6 |
omega |
15 |
7 |
lambda |
10 |
8 |
phi |
14 |
|
ide |
xidt |
xids |
data |
1 |
1 |
2 |
01/01/2001 |
2 |
1 |
8 |
21/01/2001 |
3 |
2 |
1 |
07/01/2001 |
4 |
2 |
5 |
14/01/2001 |
5 |
3 |
3 |
02/01/2001 |
6 |
3 |
5 |
30/01/2001 |
7 |
4 |
4 |
10/01/2001 |
8 |
4 |
6 |
20/01/2001 |
|
q1: Elencare tutti gli eventi per data, per città, e per
teatro che si svolgono fin un intervallo fra due date (per
noi tra il 10/01/2001 e 20/01/2001 inclusi).
|
|
|
SELECT C.nome, T.nomt, E.data, S.tit
FROM C,T,E,S
WHERE C.idc=T.xidc AND
T.idt=E.xidt AND S.
ids=E.xids AND
E.data>=#01/10/2001# AND E.data<=#01/20/2001#; |
nome |
nomt |
data |
tit
|
rho |
roxy |
14/01/2001 |
tau
|
legnano |
ariston |
10/01/2001 |
delta
|
legnano |
ariston |
20/01/2001 |
omega
|
|
q2: Contare quanti eventi si svolgono in una specifica città
( per noi Rho )
|
|
|
SELECT COUNT(*) AS TOT
FROM C, T, E
WHERE C.idc=T.xidc AND
T.idt=E.xidt AND
C.nome='rho'; |
|
q3: Eseguire la somma del costo dei biglietti per una singola
persona per tutti gli spettacoli che vengono svolti in uno
specifico teatro (per noi nel cinema Ariston di Legnano).
|
|
|
SELECT SUM(S.pre) AS
TOT
FROM S, T, E
WHERE T.idt=E.xidt AND
S.ids=E.xids AND
T.nomt='ariston'; |
|
q4: Dire in quali sale viene eseguito lo spettacolo maggiormente
rappresentato e quando.
|
|
|
SELECT T.nomt, E.data
FROM T, E
WHERE T.idt=E.xidt AND
E.xids= (
SELECT TOP 1 E.xids
FROM E GROUP BY E.xids
ORDER BY COUNT(*) DESC
); |
nomt |
data |
roxy |
14/01/2001 |
centrale |
30/01/2001 |
|
|