Ciao, sono alle primissime armi col linguaggio SQL e volevo il vostro parere su un determinato esercizio: (ditemi eventuali errori che riscontrereste eventualmente )

Dato lo schema relazionale in figura che esprime la gestione dei piani tariffari da parte di una compagnia telefonica:
CLIENTE (codicefiscale, nome, cognome, numTelefonico, pianoTariffario)
PIANOTARIFFARIO (pianoTariffario, costoScattoAllaRisposta, costoAlSecondo)
TELEFONATA (codicefiscale, data, ora, numeroDestinatario, durata)
BOLLETTA (codicefiscale, mese, anno, cifra)

-Selezionare i clienti per i quali il costo vivo delle telefonate (inteso senza scatto alla risposta) sia mediamente inferiore allo scatto alla risposta del piano tariffario da essi sottoscritto.
sugg: si utilizzi una vista (table function) per calcolare il costo vivo di ogni telefonata.

Questa sarebbe la soluzione (scritta da me, presumo sia corretta):

codice:
SELECT codicefiscale
FROM (SELECT codicefiscale, data, ora, (costoAlSecondo*durata) AS costoChiamata
      FROM TELEFONATA AS T, PIANOTARIFFARIO AS P, CLIENTE AS C
      WHERE P.pianoTariffario = C.pianoTariffario
        AND C.codicefiscale = T.codicefiscale) AS COSTOVIVO AS CV
GROUP BY codicefiscale
HAVING AVG(costoChiamata) < (SELECT costoScattoAllaRisposta          
                             FROM PIANOTARIFFARIO AS P, CLIENTE AS C          
                             WHERE C.pianoTariffario = P.pianoTariffario
                              AND C.codicefiscale = CV.codicefiscale)
Cioè, procedo creando una table function con "le stesse tuple" di telefonata.
Quello che volevo sapere è:
Invece di procedere come ho fatto (ovvero, mantenendo anche le informazioni che non mi servono circa la data e l'ora della chiamata nella table function COSTOVIVO per il solo scopo di identificare ogni tupla, poiché in TELEFONATA questi attributi fanno parte della chiave), è corretto creare una table function COSTOVIVOMEDIO(codicefiscale, costoMedioChiamata) ed esprimere le condizioni sulla media direttamente su di essa?
In pratica, la soluzione descritta dalla query seguente

codice:
SELECT codicefiscale
FROM (SELECT codicefiscale, AVG(costoAlSecondo*durata) AS costoMedioChiamata
      FROM TELEFONATA AS T, PIANOTARIFFARIO AS P, CLIENTE AS C
      WHERE P.pianoTariffario = C.pianoTariffario
        AND C.codicefiscale = T.codicefiscale
      GROUP BY codicefiscale) AS COSTOVIVOMEDIO AS CVM
WHERE costoMedioChiamata < (SELECT costoScattoAllaRisposta          
                            FROM PIANOTARIFFARIO AS P, CLIENTE AS C          
                            WHERE C.pianoTariffario = P.pianoTariffario
                              AND C.codicefiscale = CVM.codicefiscale)
è altrettanto valida quanto la precedente?