Select max problemoni...

mercoledì 19 dicembre 2007 - 06.49

andreapavia Profilo | Senior Member

come faccio dalla seguente query ad ottenere tutte le massime revioni di ogni codice_documento??????

ad esempio: io vorrei che il record con codice_documento = 14 mi apparisse una sola volta ma con la
massima revisione....

select documenti_societa_sedi.id, documenti_societa_sedi.codice_documento,
documenti_societa_sedi.id_sede_societa, documenti_societa_sedi.id_societa,
documenti.descrizione, documenti.file_fisico, documenti.revisione, documenti.data,
utenti.login
from documenti_societa_sedi, documenti, utenti where
(documenti_societa_sedi.codice_documento=documenti.codice and
utenti.id = documenti.id_utente and documenti_societa_sedi.id_societa='0')

id codice_documento id_sede_societa id_societa descrizione file_fisico revisione data login
----- ---------------- --------------- ----------- --------------------------------------- ----------- -------
16 14 0 0 miro_R2 miro_R2.htm 2 20071218 paolo
17 13 0 0 pluino_R1 pluino_R1.zip 1 20071218 andrea
18 14 0 0 miro_R1 miro_R1.htm 1 20071218 roberto
19 15 0 0 trollino_R1 trollino_R1.jpg 1 20071218 andrea
20 15 0 0 trollino_R2 trollino_R2.jpg 2 20071218 luciano
21 15 0 0 trollino_R3 trollino_R2.jpg 3 20071218 paolo

io vorrei ottenere questo

id codice_documento id_sede_societa id_societa descrizione file_fisico revisione data login
----- ---------------- --------------- ----------- --------------------------------------- ----------- -------
16 14 0 0 miro_R2 miro_R2.htm 2 20071218 paolo
17 13 0 0 pluino_R1 pluino_R1.zip 1 20071218 andrea
21 15 0 0 trollino_R3 trollino_R2.jpg 3 20071218 paolo


come si fa?????

alx_81 Profilo | Guru

>come faccio dalla seguente query ad ottenere tutte le massime
>revioni di ogni codice_documento??????
Ciao!
Considerato che non so quale sia il DBMS che stai utilizzando e come sono fatte le tue tabelle, provo a passarti questo SQL.
Con i dati che hai dovrebbe funzionare. L'unica cosa che potrebbe alterarti il risultato è quel campo data. Se uno stesso documento può avere più date (ad esempio se fosse la data di revisione) la query non ti tornerà il risultato sperato.
Se invece i dati sono proprio come li hai passati tu, dovremmo esserci
Ecco il codice:


SELECT DS.id , DS.codice_documento , DS.id_sede_societa , DS.id_societa , D.descrizione , D.file_fisico , MAX(D.revisione) AS MaxRevisione , D.data , U.login FROM documenti_societa_sedi DS JOIN documenti D ON DS.codice_documento = D.codice JOIN utenti U ON U.id = D.id_utente WHERE DS.id_societa = 0 GROUP BY DS.id , DS.codice_documento , DS.id_sede_societa , DS.id_societa , D.descrizione , D.file_fisico , D.data , U.login

Nota anche che ho usato il costrutto JOIN e non la where come hai fatto tu.
Ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

amelix Profilo | Expert

Secondo me questa non funziona...
>SELECT
> DS.id
> , DS.codice_documento
> , DS.id_sede_societa
> , DS.id_societa
> , D.descrizione
> , D.file_fisico
> , MAX(D.revisione) AS MaxRevisione
> , D.data
> , U.login
>FROM
> documenti_societa_sedi DS
> JOIN documenti D ON DS.codice_documento = D.codice
> JOIN utenti U ON U.id = D.id_utente
>WHERE
> DS.id_societa = 0
>GROUP BY
> DS.id
> , DS.codice_documento
> , DS.id_sede_societa
> , DS.id_societa
> , D.descrizione
> , D.file_fisico
> , D.data
> , U.login
Io l'avrei fatta così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

OK?



Andrea - http://www.MelisWeb.eu/

alx_81 Profilo | Guru

>Secondo me questa non funziona...
il problema è che cambia la login, poi ho erroneamente aggiunto l'id.. e comunque potrebbe cambiare altro. Quindi la mia non funziona. Il group by definito non è affidabile.
La tua soluzione è buona, ma non trova quello che serve al nostro andreapavia..

Senza le strutture stiamo un po' provando..
Comunque, dovrebbe bastare variare la tua di quel poco per ottenere quello che gli serve (order by revisione DESC).
SELECT DS.id , DS.codice_documento , DS.id_sede_societa , DS.id_societa , D.descrizione , D.file_fisico , D.revisione , D.data , U.login FROM documenti_societa_sedi AS DS JOIN documenti AS D ON DS.codice_documento = D.codice JOIN utenti AS U ON U.id = D.id_utente WHERE DS.id_societa = 0 AND D.id IN ( SELECT TOP 1 id FROM documenti_societa_sedi AS DSI JOIN documenti AS DI ON DS.codice_documento = D.codice WHERE DSI.codice_documento = DS.codice_documento ORDER BY revisione DESC)

Grazie per la puntualizzazione.
Alx81 =)

http://blogs.dotnethell.it/suxstellino

amelix Profilo | Expert

Hai ragione.
Ho confuso il campo da selezionare... adesso aspettiamo notizie...

Ma direi che in 2 si sia arrivati ad una soluzione decente.
Mi dicono che EXISTS è più veloce di IN e in questo caso si potrebbe utilizzare.

Ma è un test che si farà dopo.
Andrea - http://www.MelisWeb.eu/

andreapavia Profilo | Senior Member

grazie 1000 per l'attenzione ma non puo' funzionare....
cambiano troppi campi,......


GROUP BY
DS.id
, D.descrizione
, D.file_fisico
, D.data
, U.login

esattamente tutti questi

ho aggiunto l'id del record della massima versione nella tebella dei permetti e ho risolto il problema....

grazie 1000 per l'attenzione rivoltami

alx_81 Profilo | Guru

>grazie 1000 per l'attenzione ma non puo' funzionare....
>cambiano troppi campi,......
Ok, ma la seconda soluzione l'hai letta??
perchè a mio avviso ti risolve il problema..
Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5