|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jan 2006
Messaggi: 21
|
[DB] INTERROGAZIONE DIFFICILE
ciao a tutti, ho un problema con una query non riesco proprio a farla:
Io ho questo schema relazionale Esame(nome, prezzo) //nome è chiave Prescrizioni(codice, data, cliente, medico) //codice è chiave Esami-Prescritti( prescrizioni, esame) //entrambi sono chiave Cliente(cod-fisc, nome, città) //cod-fisc è chiave Medico(cod-fisc, nome, città) //cod_fisc è chiave Lo schema rappresenta informazioni sui clienti che si rivolgono al laboratorio per esami clinici, e sui medici che prescrivono tali indagini. Nella relazione Prescrizione sono indicati il medico, il cliente e la data di ciascuna prescrizione- In Esami-Prescritti è rappresentato l'elenco degli esami indicati in ciascuna prescrizione. Vorrei che qualcuno mi aiutasse a formulare la seguente interrogazione in SQL: I nomi dei clienti che hanno presentato una prescrizione contenente esami tutti dello stesso prezzo. GRAZIE A TUTTI!! :-) |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Presumo che il 'codice' in Prescrizioni sia lo stesso che metti in chiave in esami-prescritti, che esame nella stessa tabella sia 'nome' in Esame, ecc...cioè che le tabelle siano legate con foreign key appropriate...questo dovrebbe andare...(non ho provato!)
Codice:
select c.nome from cliente c join prescrizioni p on c.cod_fisc = p.cliente join esami_prescritti ep on p.codice = ep.prescrizioni join esame e on e.nome = ep.esame where e.prezzo = IL_PREZZO_CHE_TI_INTERESSA
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jan 2006
Messaggi: 21
|
Grazie ma..
Innanzi tutto GRAZIE MILLE PER LA RISPOSTA!!!
Tutte le tue supposizioni sono giuste, ma quando dico che voglio i nomi dei clienti che hanno presentato una prescrzione contenente esami tutti dello stesso prezzo, intendo non di un prezzo in particolare, ma che tutte i prezzi degli esami devono essere tutti uguali. E' uno dei 5 punti di un'esercizio di un'appello d'esame e non riesco proprio a risolverlo.......Grazie e buona giornata! |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
Quote:
Codice:
select c.nome from cliente c join prescrizioni p on c.cod_fisc = p.cliente join esami_prescritti ep on p.codice = ep.prescrizioni join esame e on e.nome = ep.esame where e.prezzo = ANY (SELECT Prezzo FROM Esame GROUP BY Prezzo)
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jan 2006
Messaggi: 21
|
grazie
grazie mille, pomeriggio lo provo :-)
buona giornata |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
SELECT DISTINCT Prezzo FROM Esame
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2595
|
Quote:
Il prezzo, preso dalla tabella Esame, sarà sempre uguale a qualunque prezzo della tabella Esame! Non credete?!? IMHO: Codice:
SELECT Cliente.nome, Count(QCP.codCliente) FROM Cliente INNER JOIN ( SELECT DISTINCT Cliente.codCliente, Cliente.nome, Esame.prezzo FROM Cliente INNER JOIN Prescrizioni INNER JOIN EsamiPrescritti INNER JOIN Esame ON Esame.codEsame = EsamiPrescritti.codEsame ON Prescrizioni.codPrescrizione = EsamiPrescritti.codPrescrizione ON Cliente.codCliente = Prescrizioni.codCliente ) AS QCP ON Cliente.codCliente = QCP.codCliente GROUP BY Cliente.nome HAVING Count(QCP.codCliente) = 1 ORDER BY Cliente.nome; Codice:
Esame(codEsame, prezzo) Prescrizioni(codPrescrizione, data, codCliente, codMedico) EsamiPrescritti(codPrescrizione, codEsame) Cliente(codCliente, nome, citta) Medico(codMedico, nome, citta)
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
no scusa, il mio era solo un altro modo, piu standard e leggibile. Non ho letto tutto il 3d attentamente perché non sono abituato a vedere tutti quei join. Io uso Oracle e si scrive in un altro modo.
Ho solo notato quella GROUP BY perché era in neretto
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
allora, l'ho letto. Potresti lavorare per MIN(prezzo)
Ottieni il MIN(Prezzo) per ogni cliente e poi cerchi i clienti che hanno solo quel prezzo. Scegli i clienti che nei loro prezzi hanno solo il proprio MIN. Non so se mi sono capito bene
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
dimenticavo...
ovviamente devi cercare solo quelli che hanno solo quel MIN(prezzo) quindi devi mettere il MIN in un: Codice:
AND NOT EXISTS ( SELECT 1 FROM ... WHERE prezzo <> SELECT MIN(...) ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2595
|
Credo che basti questo:
Codice:
SELECT Cliente.codCliente, Cliente.nome, count(distinct Esame.prezzo) FROM Cliente INNER JOIN Prescrizioni INNER JOIN EsamiPrescritti INNER JOIN Esame ON Esame.codEsame = EsamiPrescritti.codEsame ON Prescrizioni.codPrescrizione = EsamiPrescritti.codPrescrizione ON Cliente.codCliente = Prescrizioni.codCliente GROUP BY Cliente.codCliente, Cliente.nome HAVING count(distinct Esame.prezzo) = 1 ORDER BY Cliente.nome;
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Anch'io uso oracle, ma i join li scrivo proprio così!!
Sei mica all'infame versione 8?? :P
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Inner join è di default, non serve specificarlo, l'outer è (+) dopo il campo. Questo dopo la WHERE tra i campi di tabelle diverse perchè devo dire che non sono pratico delle JOIN dentro la clausola FROM. So che non è supportata prima della versione 9 ma non l'ho mai dovuta usare. E non ne vedo l'utilità ... ma mi incuriosisce quindi indagherò. Ciao
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:12.





















