Precedente :: Successivo |
Autore |
Messaggio |
Ghisa Utente adulto


Registrato: 06/02/04 20:29 Messaggi: 2588 Residenza: San Pellegrino Terme
|
Inviato: Mar Ago 08, 2006 12:29 pm Oggetto: Dubbi SQL |
|
|
E' tutta mattina che mi sto scervellando per fare una query, ma non ci arrivo proprio come fare a farla... vi spiego...
Ho 4 tabelle legate fra loro con delle join, la tabella principale è la preventivi con idpreventivo e nrrevisione come chiave primaria.
Id preventivo non è univoco, e revisione è incrementale... io vorrei, con una query, estrarre tutti i dati delle 4 tabelle che hanno legami con la preventivi, selezionando dalla preventivi solo un record per ogni idpreventivo prendendo il massimo da nrrevisione...
es
id rev altrimillemilacampi
1 1 *
1 2 *
2 1 *
2 2 *
2 3 *
3 1 *
Risultato:
id rev altrimillemilacampi
1 2 *
2 3 *
3 1 *
Capito dalla mia contortissima spiegazione cosa mi servirebbe?
Qualcuno può aiutarmi?  _________________ Principio di Indeterminazione di Heineken: Non potrai mai essere sicuro del numero di birre che hai bevuto la notte scorsa.
LucaGhisalberti.com |
|
Top |
|
 |
bubu Utente adolescente


Registrato: 24/03/06 20:57 Messaggi: 529 Residenza: Serina
|
Inviato: Mar Ago 08, 2006 2:48 pm Oggetto: |
|
|
prova con questa query:
SELECT p1.id AS ID, MAX(P1.REV) AS REV
FROM prev AS P1 INNER JOIN prev AS P2 ON P1.id=P2.id
GROUP BY P1.id;
id stà per idpreventivo e rev per nrrevisione...
spero di aver risolto il tuo problema
buon lavoro
ciao _________________ I say find someone you can love like crazy and who'll love you the same way back. And how do you find him? Forget your head and listen to your heart. I'm not hearing any heart. Run the risk, if you get hurt, you'll come back. Because, the truth is there, the truth is there is no sense living your life without this.
MyBlog
|
|
Top |
|
 |
Ghisa Utente adulto


Registrato: 06/02/04 20:29 Messaggi: 2588 Residenza: San Pellegrino Terme
|
Inviato: Mar Ago 08, 2006 3:12 pm Oggetto: |
|
|
bubu ha scritto: | prova con questa query:
SELECT p1.id AS ID, MAX(P1.REV) AS REV
FROM prev AS P1 INNER JOIN prev AS P2 ON P1.id=P2.id
GROUP BY P1.id;
id stà per idpreventivo e rev per nrrevisione...
spero di aver risolto il tuo problema
buon lavoro
ciao |
Grazie mille per l'aiuto, ma da lo stesso risultato di questa che avevo fatto sta mattina...
SELECT DISTINCT Preventivi.idpreventivo, MAX(NrRevisione)
FROM Preventivi
GROUP BY IDPreventivo
Il problema sorge quando devo estrarre anche altri campi...
esempio:
Ammettiamo di dover estrarre anche il campo "Data" (dove naturalmente è memorizzata la data) che ha un valore diverso fra il record con lo stesso idpreventivo, ma con diverso NrRevisione...
Aggiungendo la data nei campi da selezionare devo metterla anche nella group by, in questo modo mi divide considera i record come record distinti e non mi estrae solo quello con NrRevisione più alto...
Stessa cosa fa provando ad aggungerlo nella query che mi hai suggerito...
Dovrei fare la group by solo con IDPreventivo e non con tutti gli altri campi, ma SQLServer si incazza se non li metto tutti nella clausola di GROUP BY
Grazie mille per l'aiuto comunque!  _________________ Principio di Indeterminazione di Heineken: Non potrai mai essere sicuro del numero di birre che hai bevuto la notte scorsa.
LucaGhisalberti.com |
|
Top |
|
 |
bubu Utente adolescente


Registrato: 24/03/06 20:57 Messaggi: 529 Residenza: Serina
|
Inviato: Mar Ago 08, 2006 3:30 pm Oggetto: |
|
|
Hai provato a fare una query annidata?
del tipo:
SELECT P1.id AS ID, P1.rev AS REV, P1.data
FROM prev AS P1
WHERE p1.rev IN ( SELECT MAX(P0.REV) AS REV
FROM prev AS P0 INNER JOIN prev AS P3 ON P0.id=P3.id
GROUP BY P0.id;);
In questo modo non dovresti mettere gli altri campi che ti interessano nel GROUP BY _________________ I say find someone you can love like crazy and who'll love you the same way back. And how do you find him? Forget your head and listen to your heart. I'm not hearing any heart. Run the risk, if you get hurt, you'll come back. Because, the truth is there, the truth is there is no sense living your life without this.
MyBlog
|
|
Top |
|
 |
Ghisa Utente adulto


Registrato: 06/02/04 20:29 Messaggi: 2588 Residenza: San Pellegrino Terme
|
Inviato: Mar Ago 08, 2006 3:40 pm Oggetto: |
|
|
bubu ha scritto: | Hai provato a fare una query annidata?
del tipo:
SELECT P1.id AS ID, P1.rev AS REV, P1.data
FROM prev AS P1
WHERE p1.rev IN ( SELECT MAX(P0.REV) AS REV
FROM prev AS P0 INNER JOIN prev AS P3 ON P0.id=P3.id
GROUP BY P0.id;);
In questo modo non dovresti mettere gli altri campi che ti interessano nel GROUP BY |
Le query annidate mancavano nel mio repertorio Sqllistico... Ho fatto una prova veloce veloce e sembra funzionare a meraviglia...
Grazie Bubu! Ti devo una birra!  _________________ Principio di Indeterminazione di Heineken: Non potrai mai essere sicuro del numero di birre che hai bevuto la notte scorsa.
LucaGhisalberti.com |
|
Top |
|
 |
Ghisa Utente adulto


Registrato: 06/02/04 20:29 Messaggi: 2588 Residenza: San Pellegrino Terme
|
Inviato: Mar Ago 08, 2006 3:54 pm Oggetto: |
|
|
Ehm... la fretta è cattiva consigliera, non funziona nemmeno la tua, mi estrae lo stesso tutte le righe con lo stesso idPreventivo e non solo con il NrRevisione più alto...
Adesso provo un po' a smanettare con le query annidate...  _________________ Principio di Indeterminazione di Heineken: Non potrai mai essere sicuro del numero di birre che hai bevuto la notte scorsa.
LucaGhisalberti.com |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Mar Ago 08, 2006 4:15 pm Oggetto: |
|
|
Ghisa, prova questa:
Codice: | SELECT t1.Id, t1.Rev
FROM t1
WHERE (t1.id, t1.Rev) IN (SELECT t1.Id, MAX(t1.Rev) FROM t1 GROUP BY t1.Id) |
Con Access non va (perché è limitato), spero che con SQLServer sì... _________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
bubu Utente adolescente


Registrato: 24/03/06 20:57 Messaggi: 529 Residenza: Serina
|
Inviato: Mar Ago 08, 2006 4:33 pm Oggetto: |
|
|
Ghisa ha scritto: |
Grazie Bubu! Ti devo una birra!  |
Vinz ha scritto: |
Ghisa, prova questa:
Codice:
SELECT t1.Id, t1.Rev
FROM t1
WHERE (t1.id, t1.Rev) IN (SELECT t1.Id, MAX(t1.Rev) FROM t1 GROUP BY t1.Id)
Con Access non va (perché è limitato), spero che con SQLServer sì...
|
io ho provato questo con Access mettendo dei valori a caso e funziona:
SELECT t1.id, t1.rev, t1.data
FROM prev AS t1
WHERE (t1.rev) IN (SELECT MAX(t2.Rev)
FROM prev as t2 GROUP BY t2.Id);
certo bisognerebbe provare con un db più serio
fammi sapere come va con le query annidate  _________________ I say find someone you can love like crazy and who'll love you the same way back. And how do you find him? Forget your head and listen to your heart. I'm not hearing any heart. Run the risk, if you get hurt, you'll come back. Because, the truth is there, the truth is there is no sense living your life without this.
MyBlog
|
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Mar Ago 08, 2006 4:45 pm Oggetto: |
|
|
Ce l'abbiamo fatta via Skype, usando una vista. _________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
Ghisa Utente adulto


Registrato: 06/02/04 20:29 Messaggi: 2588 Residenza: San Pellegrino Terme
|
Inviato: Mar Ago 08, 2006 4:55 pm Oggetto: |
|
|
bubu ha scritto: | certo bisognerebbe provare con un db più serio
fammi sapere come va con le query annidate  |
E' andata bene, soprattutto con l'appoggio del vinz!
vinz ha scritto: | Ce l'abbiamo fatta via Skype, usando una vista. |
E adesso anche senza...
Grazie a tutti per l'aiuto! Era davvero una troia 'sta query...  _________________ Principio di Indeterminazione di Heineken: Non potrai mai essere sicuro del numero di birre che hai bevuto la notte scorsa.
LucaGhisalberti.com |
|
Top |
|
 |
bubu Utente adolescente


Registrato: 24/03/06 20:57 Messaggi: 529 Residenza: Serina
|
Inviato: Mar Ago 08, 2006 5:01 pm Oggetto: |
|
|
Vinz ha scritto: | Ce l'abbiamo fatta via Skype, usando una vista. |
OTTIMO
Spero di esservi stata utile  _________________ I say find someone you can love like crazy and who'll love you the same way back. And how do you find him? Forget your head and listen to your heart. I'm not hearing any heart. Run the risk, if you get hurt, you'll come back. Because, the truth is there, the truth is there is no sense living your life without this.
MyBlog
|
|
Top |
|
 |
Ghisa Utente adulto


Registrato: 06/02/04 20:29 Messaggi: 2588 Residenza: San Pellegrino Terme
|
Inviato: Ven Ago 25, 2006 11:15 am Oggetto: |
|
|
Altro problemuccio.... ho due db con la stessa struttura, ma con record diversi.
Dovrei copiare un record da una tabella di un db a quella dell'altro... esiste una query del tipo
INSERT INTO dbo.contatti.Ditte
VALUES (select * from dbo.contatti2.Ditte where ID = 100)
Io ho trovato questa, ma, come immaginavo, quando la lancio non solo mi da errori, ma mi manda anche a cagare...
Devo far per forza tutto a manina?  _________________ Principio di Indeterminazione di Heineken: Non potrai mai essere sicuro del numero di birre che hai bevuto la notte scorsa.
LucaGhisalberti.com |
|
Top |
|
 |
acadam Utente neonato


Registrato: 11/03/05 17:55 Messaggi: 42
|
Inviato: Ven Ago 25, 2006 11:58 am Oggetto: |
|
|
ciao,
hai provato con
INSERT INTO [nomeDb1].dbo.nomeTabella (...elencoCampi...)
SELECT ...elencoCampi... FROM [nomeDb2].dbo.nomeTabella
ovviamente nomeTabella ed elencoCampi sono uguali.
ciao
davide _________________ "e, in mezzo a tutto questo perdersi, c'è un uscio chiuso nell'anima
chissà se ti ricordi la tua chiave dov'è?
e, in mezzo a tutto questo sciogliersi, fa più il destino o la volontà?
E se la risposta è amore, la domanda qual è? qual è?" |
|
Top |
|
 |
vinz Amministratore


Registrato: 12/12/03 12:56 Messaggi: 6648 Residenza: San Pellegrino Terme (Bergamo)
|
Inviato: Ven Ago 25, 2006 1:31 pm Oggetto: |
|
|
Ghisa ha scritto: | Dovrei copiare un record da una tabella di un db a quella dell'altro... esiste una query del tipo
INSERT INTO dbo.contatti.Ditte
VALUES (select * from dbo.contatti2.Ditte where ID = 100)
Io ho trovato questa, ma, come immaginavo, quando la lancio non solo mi da errori, ma mi manda anche a cagare...  |
La versione corretta della query dovrebbe essere senza VALUES, quando i valori sono il risultato di una SELECT.
Quindi: Codice: | INSERT INTO dbo.contatti.Ditte
SELECT * from dbo.contatti2.Ditte where ID = 100 |
Comunque posta l'errore, perché potrebbe anche essere un problema di permessi. _________________ Let the future tell the truth and evaluate each one according to his work and accomplishments. The present is theirs; the future, for which I really worked, is mine.
Nikola Tesla |
|
Top |
|
 |
Ghisa Utente adulto


Registrato: 06/02/04 20:29 Messaggi: 2588 Residenza: San Pellegrino Terme
|
Inviato: Ven Ago 25, 2006 2:00 pm Oggetto: |
|
|
Ragazzi, grazie mille, l'unico problema a cui non avevo pensato è che l'ID è auroincrementante e non mi lascia inserire un valore... in questo modo mi da errore
Mi sa che dovrò scrivermi una query lunghissima specificando tutti i campi e tutti i valori
Adesso che ci penso però... non è che c'è un modo per fare una select evitando di estrarre un campo... che ne so, magari un
SELECT * WITHOUT ID...
Mi sa che forse ho un po' troppa immaginazione...  _________________ Principio di Indeterminazione di Heineken: Non potrai mai essere sicuro del numero di birre che hai bevuto la notte scorsa.
LucaGhisalberti.com |
|
Top |
|
 |
|