Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Una query particolare

  1. #1

    Una query particolare

    Salve a tutti, sono diversi giorni che cerco di risolvere un piccolo problema.
    Ho due tabelle in un database Access (non posso cambiarlo), una chiamata NotizieClassificazioni, che contiene i dati relativi ad una tipologia di News, ed una seconda tabella chiamata Notizie, che naturalmente contiene le News. Ora, quello che devo fare io è creare una pagina web che mi mostri l'elenco dei tipi di News e mi permetta di cancellare soltanto quei tipi che non abbiano riferimenti dentro la tabella Notizie.
    Per farlo ho creato la query:

    SELECT DISTINCT X.IdClassificazione, X.Descrizione, X.Pres
    FROM (SELECT C.IdClassificazione, C.Descrizione, N.IdClassificazione AS Pres
    FROM NotizieClassificazioni AS C LEFT JOIN Notizie AS N
    ON C.IdClassificazione = N.IdClassificazione) AS X

    La query funziona a dovere se eseguita in MS Access e Base di Open Office, ma nel Java c'è qualcosa che non va. Infatti le prime 5 righe del ResultSet sono corrette, ma esso presenta altre righe, in particolare tante quante sono quelle della tabella "Notizie". Naturalmente un accesso alle colonne del ResultSet oltre il 5 (numero di tipi di notizie) crea una eccezione. Se faccio:

    resultSet.last();
    out.println(resultSet.getString("Descrizione") + " " + resultSet.getRow());
    Ottengo:
    DESCRIZIONE 28
    Dove descrizione è la descrizione della tipologia di notizia e 28 è il numero di righe della tabella Notizie.

    Pareri?

  2. #2

  3. #3
    Mi connetto così:

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    connection=DriverManager.getConnection("jdbcdbc:dbnews");

    EDIT: Ho risolto il problema della query aggirandolo, il guaio è che così facendo interrogo il DB un po' troppe volte, vorrei poter usare quella query.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Io ho effettuato una prova, prendendo un DB Access già pronto e basandomi sulle sue tabelle (tanto si tratta di una semplice relazione 1 a molti tra due tabelle).

    Nel mio caso il numero di righe della tabella "Notizie" è 6, ma nel ResultSet ottengo solo 4 righe (ovvero, tante quante sono quelle della tabella "NotizieClassificazioni").


    Il risultato della query eseguita su Access è lo stesso identico del risultato della query lanciata da Java (e non vedo perchè dovrebbe essere altrimenti, dato che la query viene sempre e comunque eseguita da Access: Java è solo il tramite per leggerne il risultato).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Faccio anche notare che potevi usare una query un po' più semplice per ottenere ciò che volevi:

    codice:
    SELECT C.IdClassificazione, C.Descrizione, count(N.IdClassificazione) AS Quante
    FROM NotizieClassificazioni AS C LEFT JOIN Notizie AS N ON (C.IdClassificazione = N.IdClassificazione)
    GROUP BY C.IdClassificazione, C.Descrizione;
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Ti ringrazio per la query, la proverò non appena possibile.

    A titolo informativo: io sono più stagista che programmatore, la query me l'ha suggerita il collega. Le mie conoscenze di SQL si limitano a poco più di "SELECT * FROM Tabella".

  7. #7
    Mumble mumble... preso dalla curiosità ho provato subito la query nel database mdb (aperto però da OpenOffice ed ho ottenuto proprio quello che cercavo.

    Spinto da ulteriore curiosità ho schiaffato la query nel codice ed ho ottenuto la seguente risposta:

    Eccezione in setResultSet: [Microsoft][Driver ODBC Microsoft Access] Impossibile eseguire una query che non include l'espressione "IDCLASSIFICAZIONE" specificata come parte di una funzione di aggregazione.

    <- Questo sono io che pecco.

    A parte questo. Grazie.

    EDIT: rileggendo il tuo primo post, noto che anche tu hai provato la query in Java. Mi viene pensato a questo punto che il problema risiede nella mia versione dei driver MS, perché sennò altra spiegazione non c'è. Se dico Windows 7 64-bit salta la mosca al naso?

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da EorlTheKing
    Eccezione in setResultSet: [Microsoft][Driver ODBC Microsoft Access] Impossibile eseguire una query che non include l'espressione "IDCLASSIFICAZIONE" specificata come parte di una funzione di aggregazione.
    Per questa eccezione controlla di aver scritto correttamente l'istruzione SQL: il DBMS ti sta dicendo che hai incluso nella SELECT un campo (IDCLASSIFICAZIONE) che non hai riportato all'interno della clausola GROUP BY.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Ti riporto il codice:
    dao.openConnection();
    dao.setStatement(true);
    dao.setResultSet("SELECT C.IdClassificazione, C.Descrizione, count(N.IdClassificazione) AS Quante " +
    "FROM NotizieClassificazioni AS C LEFT JOIN Notizie AS N ON (C.IdClassificazione = N.IdClassificazione) " +
    "GROUP BY C.IdClassificazione, C.Descrizione;");
    ResultSet rs = dao.getResultSet();
    rs.next();
    while(!rs.isAfterLast()){
    someOutput += "<tr><td>"+rs.getString("IdClassificazione")+" </td><td>Modifica</td>";
    if(rs.getInt("Quante") == 0)
    someOutput += "<td>Cancella</td></tr>";
    else
    someOutput += "<td>Cancella</td></tr>";
    rs.next();
    }

    Ho provato a togliere C., a metterci N., ma non si schioda da lì.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.