View Full Version : [SQL] 2 esercizi!!
Fabietto206
26-01-2009, 14:23
Ho il seguente schema:
pazienti (pid, nome, cognome, indirizzo)
cartelle (pid, mid, diagnosi, trattamento)
degenze (pid, inizio, fine, reparto)
medici (mid, cognome_medico, qualifica)
1) Devo esprimere la seguente interrogazione:
Trovare i reparti per cui il numero dei pazienti con trattamento intensivo ricoverati dal 1° novembre 2008 è maggiore di 10.
Io l'ho fatta così:
select distinct reparto
from cartelle c, degenze d
where c.pid = (select d.pid
from degenze d
where c.trattamento = "intensivo"
group by d.pid
having count (reparto) > 10
and d.inizio = "1° novembre 2008")
è corretta?
2) Facendo riferimento allo schema di sopra, ho la seguente interrogazione:
select distinct cognome, nome
from pazienti
where pid in (select pid
from cartelle
where trattamento = "intensivo")
Devo esprimerla in algebra relazionale e se nn è possibile dire il motivo, io ho fatto così xò nn sono sicuro ke sia giusto:
π cognome, nome ((σ trattamento="intensivo" CARTELLE) join PAZIENTI)
mi dite se è corretta, anke se ho forti dubbi ke lo sia!!
Grazie mille
Sull'algebra relazionale non ti rispondo perchè sinceramente non me la ricordo più e potrei dire stronzate.
Per la prima domanda invece... ma sono io o quello schema non ha nessun senso?? Cioè, che relazione ci sarebbe tra cartelle e degenze? E in generale, che relazioni dovrebbero avere tra loro quelle 4 tabelle mess li cosi?
E i reparti perchè non hanno una tabella tutta loro?
Ma è il prof che ha fatto sta roba?
Tanto più che la query è abbastanza assurda. Fai il prodotto cartesiano di due tabelle e poi tenti di prendere fuori dei valori... a parte l'inefficienza della cosa, mi sembra ci sia un problema a monte.
Fabietto206
26-01-2009, 19:13
Sull'algebra relazionale non ti rispondo perchè sinceramente non me la ricordo più e potrei dire stronzate.
Per la prima domanda invece... ma sono io o quello schema non ha nessun senso?? Cioè, che relazione ci sarebbe tra cartelle e degenze? E in generale, che relazioni dovrebbero avere tra loro quelle 4 tabelle mess li cosi?
E i reparti perchè non hanno una tabella tutta loro?
Ma è il prof che ha fatto sta roba?
Tanto più che la query è abbastanza assurda. Fai il prodotto cartesiano di due tabelle e poi tenti di prendere fuori dei valori... a parte l'inefficienza della cosa, mi sembra ci sia un problema a monte.
Guarda è il testo di un compitino dell'esame di novembre, quindi lo schema l'ha fatto il prof...
CozzaAmara
26-01-2009, 19:24
select distinct reparto
from cartelle c, degenze d
where c.pid = (select d.pid
from degenze d
where c.trattamento = "intensivo"
group by d.pid
having count (reparto) > 10
and d.inizio = "1° novembre 2008")
Non credo si possa usare una funzione interna come count() dopo la clausola having.
Se non erro devi mettere count(reparto) tra i campi recuperati da SELECT (preferibilmente con un alias) e usare l'alias stesso con having.
select distinct reparto
from cartelle c, degenze d
where c.pid = (select d.pid, count (reparto) as tot
from degenze d
where c.trattamento = "intensivo"
group by d.pid
having tot > 10
and d.inizio = "1° novembre 2008")
CozzaAmara
26-01-2009, 19:26
Tanto più che la query è abbastanza assurda. Fai il prodotto cartesiano di due tabelle e poi tenti di prendere fuori dei valori... a parte l'inefficienza della cosa, mi sembra ci sia un problema a monte.
In effetti.
Va beh ho capito ora il senso di quello schema... scusate. "pid" sarebbe "pazienti id" ed è usato come parte della chiave primaria anche in cartelle e degenze.
A parte che avrei qualcosa da dire a chi ha fatto questo schema, e che se un mio collega tenta di chiedere al dba di mettere in produzione una roba fatta cosi lo strozzo, e che cmq non credo sia chiarissima la relazione che ci dovrebbe essere tra cartelle e degenze, io scriverei una roba cosi, che però non so se funzioni... bisognerebbe provare con un pò di dati.
select d.reparto, count(*) as pazienti
from cartelle c join degenze d on c.pid = d.pid
where d.inizio >= "1 nov 2008"
and c.diagnosi = "intensivo"
group by d.reparto
having count(*) > 10
Posto che non sono sicuro della correttezza del mio sql, se dovesse essere necessario fare un cross-join per tirare fuori il risultato, sarebbe un buon segno che lo schema fa schifo.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.