Non sono pratico

martedì 26 settembre 2006 - 01.37

exetera Profilo | Newbie

Salve a tutti!
Non ho molta esperienza con SQL, so appena il significato delle principali keyword.
Il mio problema è che ho una tabella in cui ogni record ha diciamo due campi:un id non univoco, e uno è una data
A me serve estrapolare una query ordinata in ordine di data che non contenga ripetizioni sull'id.
Ovvero mi servono gli id più recenti, ma senza ripetizione di id.

Spero di essere stato chiaro.
Attendo consigli con ansia!!!!

Grazie

us01739 Profilo | Expert

Se ho capito bene la tua tabella è composta solo da 2 colonne giusto?
Se è così, usa questa query:

SELECT id, data
FROM tblname
WHERE (id = (SELECT MAX(id) FROM tblname))
ORDER BY data

Non è "elegante" ma ti permette di cominciare a capire meglio le query.

Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

micto27 Profilo | Senior Member

>Salve a tutti!
>Non ho molta esperienza con SQL, so appena il significato delle
>principali keyword.
>Il mio problema è che ho una tabella in cui ogni record ha diciamo
>due campi:un id non univoco, e uno è una data
>A me serve estrapolare una query ordinata in ordine di data che
>non contenga ripetizioni sull'id.
>Ovvero mi servono gli id più recenti, ma senza ripetizione di
>id.
>
>Spero di essere stato chiaro.

se quello che vuoi ottenere è l'elenco degli ID presenti e per ciascuno di essi la massima Data:

se le uniche colonne che vuoi ottenere come risultato sono ID e Data
potresti scrivere un sql del genere:

SELECT ID, MAX(Data) As Data
FROM TABELLA
GROUP BY ID

se invece la query deve estrarre anche altre colonne:

SELECT t1.ID, t1.Data, t1.Col1, t1.Col2, t1.Col3
FROM TABELLA t1
WHERE NOT EXISTS
(SELECT 1 FROM TABELLA t2
WHERE t2.ID = t1.ID
AND t2.Data > t1.Data)

Ciao, Michele


exetera Profilo | Newbie

Veramente dovrei estrarre anche altre colonne...


>>SELECT t1.ID, t1.Data, t1.Col1, t1.Col2, t1.Col3
>>FROM TABELLA t1
>>WHERE NOT EXISTS
>>(SELECT 1 FROM TABELLA t2
>>WHERE t2.ID = t1.ID
>>AND t2.Data > t1.Data)


Non ho capito bene il codice... SELECT 1 che vuol dire??? Poi io non ho una tabella t2, è tutta un'unica tabella la mia...
Sicuramente sono io che non ho capito il tuo codice...puoi fare chiarezza nella mia mente per favore???

us01739 Profilo | Expert

Se sei alle prime armi, ti consiglio di utilizzare il codice che ti ho spedito inizialmente io perchè almeno è abbastanza intuitivo.

Se devi aggiungere delle colonne oltre ad id e data, aggiungi i vari nomi:
esempio:
select id, data, clonna1, colonna2, colonna3

Se invece le vuoi tutte, puoi usare "*":
esempio:
select *
Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

exetera Profilo | Newbie

Grazie per la risposta.
Ma sei sicuro che così ottengo quello che voglio?
Così ottengo solo i record in cui id è massimo.
In pratica io ho una tabella in cui l'id può apparire su più record, e tra tutti questi a me interessa quello con la data più alta.
Spero di essere stato chiaro, non mi viene facile spiegarlo meglio.

Grazie

micto27 Profilo | Senior Member

>Veramente dovrei estrarre anche altre colonne...
>
>
>>>SELECT t1.ID, t1.Data, t1.Col1, t1.Col2, t1.Col3
>>>FROM TABELLA t1
>>>WHERE NOT EXISTS
>>>(SELECT 1 FROM TABELLA t2
>>>WHERE t2.ID = t1.ID
>>>AND t2.Data > t1.Data)
>
>
>Non ho capito bene il codice... SELECT 1 che vuol dire??? Poi
>io non ho una tabella t2, è tutta un'unica tabella la mia...
>Sicuramente sono io che non ho capito il tuo codice...puoi fare
>chiarezza nella mia mente per favore???

Il concetto è il seguente:

leggo le righe della tabella per le quali non esista nessuna riga (sulla stessa tabella)
che a parità di ID presenti una data maggiore, pertanto di ogni ID avrò la riga con data maggiore.

i prefissi t1 e t2 servono per differenziare i 2 oggetti gestiti dalla query (che nel caso specifico
sono la stessa tabella).

La clausola EXISTS verifica se la query associata restituisce righe, pertanto in questo contesto è importante
la clausola WHERE non tanto la SELECT che però va messa, in casi del genere di solito specifico
come oggetto della select una qualsiasi costante, in questo caso SELECT 1 FROM .....

Per quanto riguarda l'altro esempio che ti è stato suggerito:

SELECT id, data
FROM tblname
WHERE (id = (SELECT MAX(id) FROM tblname))
ORDER BY data

ha il problema che restituirà un'unica riga (quella con l'ID maggiore di tutti) e non una per ogni ID.

Ciao, Michele

exetera Profilo | Newbie

Ho dato questo

SELECT * FROM preventivo WHERE NOT EXISTS (SELECT 1 FROM preventivo WHERE id_preventivo = id_preventivo and data>data) ORDER BY data DESC

in pasto al mio database, ma mi restituisce anche record con id_preventivo ripetuti...
Sicuramente sbaglio qualcosa... Ma cosa???

micto27 Profilo | Senior Member

>Ho dato questo
>
>SELECT * FROM preventivo WHERE NOT EXISTS (SELECT 1 FROM preventivo
>WHERE id_preventivo = id_preventivo and data>data) ORDER
>BY data DESC
>
>in pasto al mio database, ma mi restituisce anche record con
>id_preventivo ripetuti...
>Sicuramente sbaglio qualcosa... Ma cosa???


Prova a riscriverla così (con i prefissi), altrimenti la subquery specificata
per la clausola NOT EXISTS non è "correlata" ai dati della SELECT più esterna.

SELECT * FROM preventivo t1
WHERE NOT EXISTS (SELECT 1 FROM preventivo t2
WHERE t2.id_preventivo = t1.id_preventivo and t2.data > t1.data)
ORDER BY data DESC

ciao, Michele

exetera Profilo | Newbie

SELECT * FROM preventivo t1
WHERE NOT EXISTS (SELECT 1 FROM preventivo t2
WHERE t2.id_preventivo = t1.id_preventivo and t2.data > t1.data)
ORDER BY data DESC
Non avevo capito a fondo il senso del codice...
Ora il problema è che se la data più grande di quel id_preventivo e contenuta in due record con lo stesso id_preventivo, me li mostra entrambi...
Visto che ho più o meno capito come funziona sto facendo delle prove... ho provato ad esempio:
invece di and t2.data > t1.data) ho messo and t2.data >= t1.data), ma ottengo nessun result.

I consigli sono ben accetti

Grazie tante!

micto27 Profilo | Senior Member

>SELECT * FROM preventivo t1
>WHERE NOT EXISTS (SELECT 1 FROM preventivo t2
>WHERE t2.id_preventivo = t1.id_preventivo and t2.data > t1.data)
>ORDER BY data DESC
>Non avevo capito a fondo il senso del codice...
>Ora il problema è che se la data più grande di quel id_preventivo
>e contenuta in due record con lo stesso id_preventivo, me li
>mostra entrambi...
>Visto che ho più o meno capito come funziona sto facendo delle
>prove... ho provato ad esempio:
>invece di and t2.data > t1.data) ho messo and t2.data >=
>t1.data), ma ottengo nessun result.
>
>I consigli sono ben accetti
>
>Grazie tante!

Però allora nel caso di combinazione doppia (id/data), visto che ci sono di mezzo anche altre colonne,
qual'è la riga delle 2 o n che vuoi come risultato?

Ciao

exetera Profilo | Newbie

Una qualsiasi delle due...potrei addirittura non aver bisogno delle altre colonne effettivamente...
Come si fa?
Ho visto che sei molto ferrato in SQL...
Siccome ne avrò ancora taaaaaaanto bisogno, potresti consigliarmi qualche manuale ben fatto e intuitivo in cui imparare in poco tempo?
Grazie

edit: Se mi servono solo quelle due posso utilizzare la clausola DISTINCT...e se invece vorrei, ad esempio, quella con ID più grande, aggiungo t1.id>t2.id.Giusto???

lbenaglia Profilo | Guru

>Il mio problema è che...
...non ci hai detto che DBMS utilizzi e non hai postato un esempio di codice, quindi ci sono già stati 12 (dodici!!) post che non hanno risolto il tuo problema.
Se vuoi ricevere una risposta DEFINITIVA, posta la struttura della tabella (CREATE TABLE...), alcune righe di prova (INSERT INTO...) ed il risultato che vuoi ottenere in base a quei dati.

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

micto27 Profilo | Senior Member

>Una qualsiasi delle due...potrei addirittura non aver bisogno
>delle altre colonne effettivamente...
>Come si fa?
>Ho visto che sei molto ferrato in SQL...
>Siccome ne avrò ancora taaaaaaanto bisogno, potresti consigliarmi
>qualche manuale ben fatto e intuitivo in cui imparare in poco
>tempo?
>Grazie
>
>edit: Se mi servono solo quelle due posso utilizzare la clausola
>DISTINCT...e se invece vorrei, ad esempio, quella con ID più
>grande, aggiungo t1.id>t2.id.Giusto???

Se ti servono solo quelle 2 colonne ti conviene fare così:

SELECT id_preventivo, max(data) FROM preventivo
GROUP BY id_preventivo
ORDER BY data DESC

per quanto riguarda riferimenti a manuali al volo non mi viene in mente nulla però se trovo qualcosa
ti mando i riferimenti.

Ciao, Michele

exetera Profilo | Newbie

Caro lbenaglia,
io volevo si una risposta, ma volevo anche imparare...e così l'ho fatto...
Se mi aveste postato una risposta come dici tu "definitiva" immediatamente, l'avrei si utilizzata,ma non ci avrei capito niente...
E poi i post non costano nulla se non il tempo di chi li posta....

Grazie Michele!

lbenaglia Profilo | Guru

>Se mi aveste postato una risposta come dici tu "definitiva" immediatamente,
>l'avrei si utilizzata,ma non ci avrei capito niente...
Perché? Generalmente si è portati a spiegare la soluzione proposta...

>E poi i post non costano nulla se non il tempo di chi li posta....
E dici poco?
Non capisco perché postare una domanda confusa ed incompleta e ricevere la soluzione desiderata dopo decine di risposte... perdi tempo tu e chi cerca di aiutarti, no?

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Brainkiller Profilo | Guru

>Caro lbenaglia,
>io volevo si una risposta, ma volevo anche imparare...e così l'ho fatto...

Hai ragione, devi anche capire che il Forum o più in generale i Forum non sono un sostituto di un libro o di una lezione frontale classica. La funzione principale, secondo me, del Forum è quella di darti consigli mirati su domande mirate e/o consigli su dove dirigersi per apprendere una tecnologia, un argomento particolare, ecc.

A complemento ci vuole anche uno studio approfondito da parte di colui che pone la domanda, anche perchè un apprendimento frammentato come può essere quello derivante dal Forum non ti porta molto lontano.

Se c'è una conoscenza parziale o quasi completa il forum ti può tappare dei buchi, ma se c'è zero conoscenza l'utilità del Forum è quasi tendente a zero perchè ti risolve istantaneamente il problema posto ma al successivo step sei di nuovo fermo.

Infatti critico spesso chi pone domande generiche del tipo "Come si fa un sito web ? " beh potremo discuterne per ore.

>Se mi aveste postato una risposta come dici tu "definitiva" immediatamente,
>l'avrei si utilizzata,ma non ci avrei capito niente...

Io ti consiglio questo, prima regola postare una domanda quanto più articolata possibile, più dettagli più chiarezza. In questo modo la risposta può essere altrettanto mirata, chiara e diretta. Una volta che tu hai la risposta, puoi provare ciò che ti è stato consigliato, studiare, adattarla ed eventualmente se non capisci continuare il Thread chiedendo ulteriori delucidazioni. Così facendo ad ogni step/messaggio acquisisci + conoscenze.

>E poi i post non costano nulla se non il tempo di chi li posta....

Appunto, ma visto che il tempo è denaro ... meglio specificare bene la domanda così invece di perdere tempo in messaggi inutili, tipo che database hai, ecc.ecc. puoi sfruttarli per chiedere dettagli più utili in seguito.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

exetera Profilo | Newbie


Beh forse hai ragione tu, la prossima volta farò le cose per bene
E' che non sono espertissimo in materia, quindi non so nemmeno cosa vi serva per capire il problema...
Per questo ho provato a spiegarlo a parole più che con il codice.

Comunque ormai ci siamo...

>SELECT * FROM preventivo t1
>WHERE NOT EXISTS (SELECT 1 FROM preventivo t2
>WHERE t2.id_preventivo = t1.id_preventivo and t2.data > t1.data)
>ORDER BY data DESC

Funziona..Ora dovrei prendere una riga qualsiasi tra quelle che hanno stesso id_preventivo e stessa data.
Si può fare? Come?

Grazie!

lbenaglia Profilo | Guru

>Comunque ormai ci siamo...
>
>>SELECT * FROM preventivo t1
>>WHERE NOT EXISTS (SELECT 1 FROM preventivo t2
>>WHERE t2.id_preventivo = t1.id_preventivo and t2.data > t1.data)
>>ORDER BY data DESC
>
>Funziona..Ora dovrei prendere una riga qualsiasi tra quelle che
>hanno stesso id_preventivo e stessa data.
>Si può fare? Come?
Appunto, siamo alla situazione di partenza, non hai ancora raggiunto il tuo scopo
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

exetera Profilo | Newbie

ok ok, ho capito....
ma il problema ormai mi sembra molto chiaro...mi serve silo una riga invece che più d'una...

>>SELECT * FROM preventivo t1
>>WHERE NOT EXISTS (SELECT 1 FROM preventivo t2
>>WHERE t2.id_preventivo = t1.id_preventivo and t2.data > t1.data)
>>ORDER BY data DESC

Ho risolto mettendo
SELECT * FROM preventivo t1
WHERE NOT EXISTS (SELECT 1 FROM preventivo t2
WHERE t2.id_preventivo = t1.id_preventivo and t2.data > t1.data)
GROUP BY id_preventivo
ORDER BY data DESC

Non so se è totalmente corretto, ma sembra funzionare.

Grazie ancora a tutti per il prezioso aiuto... Ho imparato molto in questi mille mila post
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5