Esercizio di Algebra relazionale - SQL

di Anonimizzato17659 il
10 risposte
Buon giorno . Devo risolvere un esercizio di algebra relazionale e trasformarlo in SQL .

Considerare la seguente base di dati relativa ad album, cantanti e vendite:
Album(Codice, Cantante, Titolo)
Vendite(Album, Anno, CopieVendute)

4. Trovare i cantanti che hanno inciso almeno due dischi diversi nello stesso anno.

In algebra relazionale ho realizzato questo tipo di interrogazione :

?Codice2,Tit2,Alb2,Anno2,CV2? Codice,Titolo, Album,Anno , CopieVendute(Album)
p Cantante( sAnno=Anno2?Codice <> Codice2(Album |X| Vendite))

Vorrei trasformarlo in SQL Con ACCESS pero non ci riesco . Le tabelle sono le seguenti

Album

Codice Titolo Cantante
1 Miguel Dalida
2 Il tuo bacio è come un rock Adriano celentano
3 Donna amante mia Umberto Tozzi


Vendite
Album Anno Copievendute

Miguel 1967 1000
Alla conquista dell'America 1987 2000
Arrivederci 2007 50000

10 Risposte

  • Ma ci hai provato? Cosa hai scritto?
  • Secondo me le tabelle non andrebbero strutturate così, ma le vedrei così:
    Cantanti
    IDCantante (numerazione automatica, chiave primaria)
    Cantante

    Album
    IDAlbum (numerazione automatica, chiave primaria)
    Titolo
    IDCantante (numerico)
    Anno
    CopieVendute

    Relazione Cantanti uno-a-molti Album attraverso il campo IDCantante.

    Io non so usare SQL, ma Access offre altri strumenti per arrivarci ugualmente. Puoi usare una query che si chiama "query di ricerca duplicati" (esiste una apposita procedura guidata) da applicare sul campo Titolo...questo nella maniera più semplice possibile. Se si ritiente che un Titolo (per problemi di omonimia) sia stato prodotto da più Cantanti, la ricerca duplicati deve essere effettuata sulla coppia Titolo-IDCantante.
    Dopo aver controllato che questa query funziona, puoi andare a leggere l'SQL sottostante.

    P.S.: credo di aver semplificato il discorso strettamente alla domanda. Vorrei aggiungere che se un Album viene inciso da molti Cantanti, deve cambiare la relazione Cantanti molti-a-molti Album, attraverso una tabella di congiunzione che si potrebbe chiamare AlbumCantanti.
  • Grazie per aver risposto pero' non seguo piu' il ragionamento .
    L'unica cosa certa che avevo era la struttura delle tabelle .

    Le tabelle secondo il mio ragionamento sono corrette anche' perche' ho risolto le prime tre domande trasformando l'algebra in SQL e non ho avuto problemi .

    In ogni modo trasformando le istruzioni di algebra relazionale in SQL sono arrivato a questo punto :


    SELECT Codice as Codice2 , Titolo as Titolo2 , Cantante as Cantante2 , Copievendute as CV2 , Anno as Anno2 , Album as Album2
    FROM Album , Vendite


    Mi viene fuori il JOIN come una grande tabella con tutti gli attributi ripetuti .
    Il problema che si presenta e' come confrontare per esempio Codice con Codice2 .
    Appena provo con WHERE , c'e' sempre qualcosa di sbagliato . Sono davvero in difficolta'
  • FabioPOl ha scritto:


    Le tabelle secondo il mio ragionamento sono corrette anche' perche' ho risolto le prime tre domande trasformando l'algebra in SQL e non ho avuto problemi.
    Limitatamente al voler rispondere alle singole domande dei tuoi quiz, può darsi che vada bene lo stesso.
    Il discorso della NORMALIZZAZIONE, ossia la corretta organizzazione dei campi nelle tabelle e le conseguenti relazioni, va affrontato come ho detto io...di conseguenza anche la costruzione delle query diventa più snella.
  • L' esercizio mi impone di strutturare le tabelle come da descrizione . Non posso cambiare gli attributi come piace a me . Nell' esercizio vengono anche evidenziate le relazioni . Album , Anno e Codice.
    Comunque Grazie per l'interessamento
  • FabioPOl ha scritto:


    L' esercizio mi impone di strutturare le tabelle come da descrizione . Non posso cambiare gli attributi come piace a me . Nell' esercizio vengono anche evidenziate le relazioni . Album , Anno e Codice.

    FabioPOl ha scritto:


    Considerare la seguente base di dati relativa ad album, cantanti e vendite:
    Album(Codice, Cantante, Titolo)
    Vendite(Album, Anno, CopieVendute)
    Forse vuoi dirmi che lo stesso Album "Il tuo bacio è come un rock" viene analizzato in più anni e non solo nell'Anno di uscita. Però questo andava chiarito per bene.
    Perdona le mie pignolerie, ma mi lascio trasportare dal MIO modo di concepire questi database (ne ho uno molto simile è più vasto...da normalizzare ad hoc necessariamente, altrimenti non ci si raccapezza).
    Nel frattempo mi sono perso. Le tabelle sono solo quelle due del primo post? La relazione è una sola? Ma dove sta? Fra quali campi?
  • Giusta osservazione . Ho riletto il testo e mi sono accorto che qualcosa effettivamente non quadra. In effetti dovrebbe esserci una relazione tra la tabella Album e la tabella Vendite . La relazione e' necessariamente individuata tra l'attributo Album.Codice e Vendite.Album
    esempio

    Album
    Codice Cantante Titolo
    1 Celentano Il mio bacio e' come un rock

    Vendite
    Album Anno Copievendute
    1 1966 20000

    Naturalmente le informazioni sono inventate . Credo che adesso le tabelle siano corrette . Praticamente sono legate dagli attributi Codice e Album.
  • Ho tentato di ricostruire secondo le tue indicazioni. Non ho avuto modo di testare, ma ragionando per piccoli passi:

    1. Ho prima creato una Query1 (di selezione) che include entrambe le tabelle con i seguenti campi: Codice, Cantante, Titolo, Anno, CopieVendute. Questo il suo SQL
    SELECT Album.Codice, Album.Cantante, Album.Titolo, Vendite.Anno, Vendite.CopieVendute
    FROM Album INNER JOIN Vendite ON Album.Codice = Vendite.Album;
    2. Ho creato una "query di ricerca duplicati" su Query1 che punta sulla coppia campi Cantante-Anno. L'SQL che ne è venuto fuori è questo
    SELECT First(Query1.[Cantante]) AS CantanteCampo, First(Query1.[Anno]) AS AnnoCampo, Count(Query1.[Cantante]) AS NumDuplicati
    FROM Query1
    GROUP BY Query1.[Cantante], Query1.[Anno]
    HAVING (((Count(Query1.[Cantante]))>1) AND ((Count(Query1.[Anno]))>1));
  • Molto bravo e ti ringrazio. Non ho tempo di provare l'esercizio per oggi . domani lo provo .
    Ho visto che hai utilizzato l'INNER JOIN per confrontare le ennuple e secondo me e' un'idea geniale .
    Grazie ancora sei davvero bravo
  • Buon giorno Osvaldo . Il programma in Access non funziona per qualche errore di sintassi.
    Il ragionamento e' corretto . Mi si blocca alla terza riga quando dice SELECT FIRST.
    Un errore l'ho trovato ed quello su Ccount . C'e' una C di troppo e l'ho cancellata pero' rimane sempre uno o piu' di uno errori di sintassi .Peccato spero di riuscire a correggerlo


    SELECT Album.Codice, Album.Cantante, Album.Titolo, Vendite.Anno, Vendite.CopieVendute
    FROM Album INNER JOIN Vendite ON Album.Codice = Vendite.Album
    SELECT FIRST (Query1.[Cantante] ) AS CantanteCampo , FIRST (Query1.[Anno]) AS AnnoCampo , count (Query1. [Cantante] ) AS NumDuplicati
    FROM Query1
    GROUP BY Query1.[Cantante], Query1.[Anno]
    HAVING ( ( (Count(Query1.[Cantante] ) )>1) AND ((Count(Query1.[Anno]))>1))
Devi accedere o registrarti per scrivere nel forum
10 risposte