>come vedete sono nuova del mondo SQL ma ho assolutamente bisogno
>di voi per la risoluzione di 6 maledette query da implementare
>in Access per l'orale di un esame
Ciao Sara,
Io una mano te la do volentieri, ma mi devi promettere che "ci sbatterai la testa" sulle soluzioni che ti sto per proporre, OK?
Allora, iniziamo subito a dire che esistono più risposte per ogni singola domanda (usando combinazioni di inner/outer join e degli operatori IN ed EXISTS), ma ho preferito rispondere in modo differente proponendoti di volta in volta costrutti diversi.
1. Costo delle periferiche che sono compatibili con almeno un computer Apple
SELECT P.Costo_P
FROM Periferica AS P
INNER JOIN (
SELECT C1.Periferica
FROM [Compatibilita'] AS C1
INNER JOIN Computer AS C2
ON C1.Computer = C2.Codice_C
WHERE C2.Costruttore_C = "Apple"
GROUP BY C1.Periferica
) AS Q
ON P.Codice_P = Q.Periferica;
2. Descrizione delle periferiche che non sono compatibili con alcun computer Apple
SELECT P.Descrizione, P.Codice_P
FROM Periferica AS P
INNER JOIN [Compatibilita'] AS C
ON P.Codice_P = C.Periferica
WHERE NOT EXISTS(
SELECT *
FROM Computer
WHERE Codice_C = C.Computer
AND Costruttore_C = "Apple"
);
3. Codice e Descrizione periferiche installabili su tutti i computer Apple
SELECT P.Codice_P, P.Descrizione
FROM Periferica AS P
INNER JOIN (
SELECT C1.Periferica
FROM [Compatibilita'] AS C1
INNER JOIN Computer AS C2
ON C1.Computer = C2.Codice_C
WHERE C2.Costruttore_C = "Apple"
GROUP BY C1.Periferica
HAVING COUNT(*) = (
SELECT COUNT(*)
FROM Computer
WHERE Costruttore_C = "Apple"
)
) AS Q
ON P.Codice_P = Q.Periferica;
4.Codice e Descrizione periferiche installabili su tutti i computer Apple nell’anno 2007
SELECT P.Codice_P, P.Descrizione
FROM Periferica AS P
INNER JOIN (
SELECT C1.Periferica
FROM [Compatibilita'] AS C1
INNER JOIN Computer AS C2
ON C1.Computer = C2.Codice_C
WHERE C2.Costruttore_C = "Apple"
AND C1.Anno_Produzione = "2007"
GROUP BY C1.Periferica
HAVING COUNT(*) = (
SELECT COUNT(*)
FROM Computer
WHERE Costruttore_C = "Apple"
)
) AS Q
ON P.Codice_P = Q.Periferica;
1. Selezionare tutti i dati degli abbonati che non hanno sottoscritto alcuna offerta di abbonamento che comprenda anche l’Espresso.
SELECT A1.*
FROM Abbonato AS A1
INNER JOIN (
SELECT A.Abbonato
FROM Abbonamento AS A
INNER JOIN (
SELECT C.Offerta, C.Rivista
FROM Comprende AS C
INNER JOIN Rivista AS R
ON C.Rivista = R.Codice_R
WHERE R.Descrizione <> "Espresso"
) AS O
ON A.Offerta = O.Offerta
GROUP BY A.Abbonato
) AS A2
ON A1.Codice_Abbonato = A2.Abbonato;
2. Selezionare le riviste che non sono mai state offerte in abbonamento all’Espresso
SELECT R.*
FROM Rivista AS R
INNER JOIN (
SELECT C2.Rivista
FROM Comprende AS C2
LEFT JOIN (
SELECT C1.Offerta
FROM Comprende AS C1
INNER JOIN Rivista AS R
ON C1.Rivista = R.Codice_R
WHERE R.Descrizione = "Espresso"
) AS O
ON C2.Offerta = O.Offerta
WHERE O.Offerta IS NULL
) AS Q
ON R.Codice_R = Q.Rivista;
Un esercizio utile sarebbe quello di riscrivere 6 query equivalenti a quelle suggerite...
In bocca al lupo!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org