265 messaggi dal 08 dicembre 2006
Buonasera a tutti e buone feste.
Vorrei poter inserire da una tabella dei risultati che si trovano in colonne che io devo specificare, ad esempio "colonna1","colonna3","colonna5","colonna7",oltre il campo data,quindi 5 campi, in un'altra tabella di sole due colonne.
Ho usato l' "INSERT INTO .. SELECT" ma sono riuscito ad estrarmi solo "colonna1".
Grazie a tutti.
5.610 messaggi dal 09 febbraio 2002
Contributi
ciao, stai usando MySql o Sql Server?

inactive ha scritto:
Ho usato l' "INSERT INTO .. SELECT

Va bene, tuttavia se selezioni 5 colonne dalla tabella di orgine è necessario che la tabella di destinazione abbia anch'essa 5 colonne.

Altrimenti, puoi concatenare i valori della tabella di origine... ma non so se questa è soluzione che cerchi.

INSERT INTO destinazione (testo, data) SELECT CONCAT(colonna1, colonna2, colonna3, colonna4) as colonnaTesto, colonnaData FROM origine;

Modificato da BrightSoul il 06 gennaio 2012 20.05 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
265 messaggi dal 08 dicembre 2006
Ciao e graze per la risposta.
Il DataBase è MySql 5.
Allora, sono partito molto alla lontana per risolvere il problema.
Il mio scopo è quello di creare una stored procedure che quando invocata mi crei una tabella temporanea con all'interno i record di cui al precedente mio post.
L'uso del CONCAT non mi viene in aiuto.
Ho cercato di ripetere l'INSERT INTO...SELECT per due volte all'interno del query editor ma ho un errore.
Per rendere meglio l'idea, mi servirebbe un "ritorno a capo" nella tabella di destinazione quando la query incontra l'altro campo che ho specificato.
Modificato da inactive il 06 gennaio 2012 20.22 -
5.610 messaggi dal 09 febbraio 2002
Contributi
ciao,

inactive ha scritto:

Per rendere meglio l'idea, mi servirebbe un "ritorno a capo" nella tabella di destinazione quando la query incontra l'altro campo che ho specificato.

mmh, non sono sicuro di aver capito bene. Vediamo se questo può aiutarti:
Al posto della INSERT INTO...SELECT potresti provare una REPLACE INTO...SELECT che ha la stessa funzione dell'insert ma nel caso siano già presenti dei record con la stessa chiave primaria, provvederà a rimuoverli così che l'inserimento dei nuovi record non vada in errore.

inactive ha scritto:

mi crei una tabella temporanea con all'interno i record di cui al precedente mio post.

Se invece volessi creare una tabella temporanea, allora prova con CREATE TEMPORARY TABLE.
CREATE TEMPORARY TABLE temporanea SELECT Colonna1, Colonna2, Colonna3, Colonna4, ColonnaData FROM origine;
Ti crea una tabella idonea ad accomodare tutte le colonne selezionate con la SELECT. Le tabelle temporanee sono per connessione, quindi tanti utenti, contemporaneamente, possono creare tabelle temporanee con lo stesso nome che verranno droppate automaticamente da MySql alla chiusura della connessione.
Se ti capita di dover ricreare la tabella temporanea all'interno della stessa connessione, allora potresti prima lanciare un DROP TABLE.
DROP TABLE IF EXISTS temporanea;

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
265 messaggi dal 08 dicembre 2006
ehm...no...allora, riconosco il mio pessimo modo di spiegare le cose purtroppo....

Ho la seguente tabella composta in questo modo con questi record:

data|nome|cogmome|campo1|campo2|campo3|campo4|campo5|
06/01/2012|Pink|MUCCA |POLLO | IS_ON|IS_OFF| OK | NOK |

Il mio scopo è di creare una STORED PROCEDURE che, quando invocata, mi crei una tabella temporanea con la struttura seguente, e me la popoli in questo modo:

data|nome|cognome|campo |
06/01/2012|Pink| MUCCA|POLLO |
06/01/2012|Pink| MUCCA|IS_ON |
06/01/2012|Pink| MUCCA|IS_OFF|
06/01/2012|Pink| MUCCA| OK |
06/01/2012|Pink| MUCCA| NOK |

In pratica i campi fissi sono "data-nome-cognome", mentre il campo "CAMPO" elenca il contenuto dei campi "campo1" .. "campo5" della tabella di origine.
Spero di essere stato più chiaro con un esempio visivo.
Grazie ancora!!
Modificato da inactive il 06 gennaio 2012 21.24 -
5.610 messaggi dal 09 febbraio 2002
Contributi
ok, ora è chiaro :) Devi trasporre alcune colonne in righe. Non mi vengono in mente funzioni specifiche di MySql per fare trasposizioni, però puoi provare in questo modo, facendo delle UNION. Ciascuna delle colonne campoN si trova su una propria SELECT e ogni SELECT selezionerà sempre lo stesso numero di colonne (4), in accordo con il numero di colonne presenti nella tabella di destinazione.

INSERT INTO destinazione (data, nome, cognome, campo)
SELECT data, nome, cognome, campo1 FROM origine
UNION ALL SELECT data, nome, cognome, campo2 FROM origine
UNION ALL SELECT data, nome, cognome, campo3 FROM origine
UNION ALL SELECT data, nome, cognome, campo4 FROM origine
UNION ALL SELECT data, nome, cognome, campo5 FROM origine;

Modificato da BrightSoul il 06 gennaio 2012 21.31 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
265 messaggi dal 08 dicembre 2006
...è esattamente quello che volevo fare e funziona...grazie per il tuo aiuto...
5.610 messaggi dal 09 febbraio 2002
Contributi
prego!
Considera anche di aggiungere una colonna chiamata "nomecampo" nella tabella di destinazione. In essa potresti inserire il nome del campo originale, oppure semplicemente un numero che lo identifichi.

INSERT INTO destinazione (data, nome, cognome, nomecampo, campo)
SELECT data, nome, cognome, 1 as nomecampo, campo1 FROM origine
Questo perché quando vai a rileggere i dati dalla tabella di destinazione devi poter riconoscere da quale campo proveniva un dato valore. Es. se volessi recuperare tutti e soli i valori di "campo3", potresti fare una SELECT * FROM destinazione WHERE nomecampo=3.

ciao
Modificato da BrightSoul il 06 gennaio 2012 21.51 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC