PDA

View Full Version : [SQL] migliorare il risultato di una query con molte join


TorpedoBlu
03-07-2008, 12:09
ciao ragazzi, per un progetto che deve effettuare lo storico modifiche sul mio db ho la necessità di effettuare una Select enorme (in una stored procedure per migliorare le performance) su molteplici tabelle (molte delle quali referenziate tra di loro) attraverso una decina di left outher join.

il risultato sono tantissime righe... ovviamente la permutazione dei dati delle tabelle... il risultato devo metterlo in un xml (ma quello lo faccio chiaramente lato applicazione)

ad esempio se ho l'anagrafe e 3 residenze avrò 3 righe (1 nome x 3 residenze)

nome1, cognome1, residenza1
nome1, cognome1, residenza2
nome1, cognome1, residenza3

e l'xml associato sarebbe


<nome>nome1</nome>
<cognome>cognome1</cognome>
<residenze>
<residenza>residenza1</residenza>
<residenza>residenza2</residenza>
<residenza>residenza3</residenza>
</residenze>

capite che però se ho gia due recapiti telefonici, le righe del db diventano da 3 a 6 (1 nome x 3 residenze x 2 recapiti)

nome1, cognome1, residenza1, telefono1
nome1, cognome1, residenza2, telefono1
nome1, cognome1, residenza3, telefono1
nome1, cognome1, residenza1, telefono2
nome1, cognome1, residenza2, telefono2
nome1, cognome1, residenza3, telefono2

e per produrre l'xml associato gia è + complicato

<nome>nome1</nome>
<cognome>cognome1</cognome>
<residenze>
<residenza>residenza1</residenza>
<residenza>residenza2</residenza>
<residenza>residenza3</residenza>
</residenze>
<recapiti>
<telefono>telefono1<telefono>
<telefono>telefono1<telefono>
</recapiti>



Questi sono solo esempi di fantasia per far comprendere il problema....

dovendo fare join su una ventina di tabelle ognuna con un numero medio di 40 campi il numero di righe di output è davvero spropositato con moltissimi dati ripetuti o nulli e il problema diventa scorrere tutte le righe per costruire tutti i tag innestati (anche 4 o 5 generazioni di nodi).


La struttura dell'XML l'ho fatta e ho anche un insieme di classi per costruire i nodi (dando in input la sequenza di stringhe rappresentanti i campi della tabella associata) ma dovermi scorrere migliaia di tuple cercando di fare ordine (del tipo questo nome l'ho gia inserito, questo telefono appartiene a questo nome, questo nome e questo telefono l'ho gia inserito per questo nodo ecc...)


qualcuno ha esperienze in merito?


L'applicazione è una web application Java (non deve usare EJB) su IBM DB2 8.2 (tramite Jt400)

banryu79
03-07-2008, 12:57
Non puoi usare la DISTINCT (http://www.sql-tutorial.com/sql-distinct-sql-tutorial/)nelle SELECT?

TorpedoBlu
03-07-2008, 13:42
Non puoi usare la DISTINCT (http://www.sql-tutorial.com/sql-distinct-sql-tutorial/)nelle SELECT?

certo, ma la clausola distinct toglie le linee duplicate e questo gia lo faccio, mentre ogni linea da me rappresenta una composizione di valori diversi... magari diversi per una sola colonna su 500...

io vorrei cercare di capire se è possibile tirare fuori i valori gia organizzati senza riempire per forza tutta la matrice rappresentativa:

nome1 cognome 1 .. .. .. .. .. .. .. telefono 1
/ / telefono2

al posto di
nome1 cognome 1 .. .. .. .. .. .. .. telefono 1
nome1 cognome 1 .. .. .. .. .. .. .. telefono 2

banryu79
03-07-2008, 15:02
scusa :doh: ogni tanto sparo qualche vaccata su argomenti che non conosco a sufficienza :stordita:

Purtroppo il materia SQL sono nubbissimo (e il mio posto poco sopra lo dimostra) ergo non ti so aiutare nel problema in questione, ciao :)

TorpedoBlu
03-07-2008, 16:42
qualcuno mi suggerisce di usare result set tipizzati.. ma non so come si implementano in db2 e non trovo documentazione

gugoXX
03-07-2008, 17:38
qualcuno mi suggerisce di usare result set tipizzati.. ma non so come si implementano in db2 e non trovo documentazione

Non c'entra niente DB2, e' al livello dell'output, dell'XML.
In pratica ti stanno proponendo di non fare nessuna JOIN.
E di avere una sezione del file XML per ciascuna tabella.
Mi sembra anche sensato, per un problema tipo "Estrarre lo storico dei dati del Database"

TorpedoBlu
04-07-2008, 08:28
mi è stato consigliato di usare record tipizzati:


nome1, cognome1, tipo:RESIDENZA, residenza1, tel:null
nome1, cognome1, tipo:RESIDENZA, residenza2, tel:null
nome1, cognome1, tipo:RESIDENZA, residenza3, tel:null
nome1, cognome1, tipo:TELEFONO, residenza:null, telefono1
nome1, cognome1, tipo:TELEFONO, residenza:null, telefono2


ma non capisco cosa intendono.. qualcuno ha esperienza in merito? ho cercato su google ma non trovo nulla...

gugoXX
04-07-2008, 08:34
Tipo questo:


<xml ....>
<Persone>
<Persona>
<ID>id1</ID>
<nome>nome1</nome>
<cognome>cognome1</cognome>
</Persona>
<Persona>
<ID>id2</ID>
<nome>nome2</nome>
<cognome>cognome2</cognome>
</Persona>
</Persone>
<Inidirizzi>
<Indirizzo>
<ID>id1</ID>
<Via>via di sotto</Via>
</Indirizzo>
<Indirizzo>
<ID>id1</ID>
<Via>via di sopra</Via>
</Indirizzo>
<Indirizzo>
<ID>id2</ID>
<Via>via di lato</Via>
</Indirizzo>
</Indirizzi>
</XML>


Ciascuna tabella ha il suo tipo di record, e viene memorizzata indipendentemente dalle altre.

TorpedoBlu
04-07-2008, 08:48
Tipo questo:


<xml ....>
<Persone>
<Persona>
<ID>id1</ID>
<nome>nome1</nome>
<cognome>cognome1</cognome>
</Persona>
<Persona>
<ID>id2</ID>
<nome>nome2</nome>
<cognome>cognome2</cognome>
</Persona>
</Persone>
<Inidirizzi>
<Indirizzo>
<ID>id1</ID>
<Via>via di sotto</Via>
</Indirizzo>
<Indirizzo>
<ID>id1</ID>
<Via>via di sopra</Via>
</Indirizzo>
<Indirizzo>
<ID>id2</ID>
<Via>via di lato</Via>
</Indirizzo>
</Indirizzi>
</XML>


Ciascuna tabella ha il suo tipo di record, e viene memorizzata indipendentemente dalle altre.

grazie, questo però è quello che voglio fare.. come faccio a farlo con SQL? il mio problema di come gestire il risultato delle query rimane, il numero delle tuple prodotte.

Esistono queste semistrutture in sql? (qualcosa di simile alle strutture C e agli oggetti in java penso)

gugoXX
04-07-2008, 08:50
grazie, questo però è quello che voglio fare.. come faccio a farlo con SQL? il mio problema di come gestire il risultato delle query rimane, il numero delle tuple prodotte.

Esistono queste semistrutture in sql? (qualcosa di simile alle strutture C e agli oggetti in java penso)

Non ho capito.
QUESTO nella frase cos'e'?
Il tuo risultato o quello che ho postato io poco fa?

In entrambi i casi non serve scomodare alcuna "semistrittura" dell'SQL, che peraltro e' sempre specifica per ciascun motore.
Oracle ha la sua implementazione, etc.
Ma tanto non cambierebbe la complessita' del tuo problema.
Si risolve tutto facendo una (io dico tante) query, e poi con postprocess per realizzare l'XML

TorpedoBlu
04-07-2008, 10:32
Non ho capito.
QUESTO nella frase cos'e'?
Il tuo risultato o quello che ho postato io poco fa?

In entrambi i casi non serve scomodare alcuna "semistrittura" dell'SQL, che peraltro e' sempre specifica per ciascun motore.
Oracle ha la sua implementazione, etc.
Ma tanto non cambierebbe la complessita' del tuo problema.
Si risolve tutto facendo una (io dico tante) query, e poi con postprocess per realizzare l'XML

conosci la semantica per realizzare l'xml?

gugoXX
04-07-2008, 10:51
Ci sono tanti modi di realizzare un XML, ma non lo farei sicuramente usando i linguaggi imperativi dei database come il TSQL o il PL/SQL se e' questo che stai chiedendo.
Dal database estrarrei i dati che mi servono, e con un linguaggio tipo C#, Python o altri realizzerei la presentazione XML.

Comunque la complessita' realizzativa sarebbe la stessa anche in TSQL o PL/SQL, se non che hai molti meno strumenti a disposizione e la la leggibilita' del codice che ne segue e' davvero ridotta.

Ma prima di tutto, prima di decidere come scrivere l'XML, devi veramente decidere COSA scrivere. Ovvero il formato del tuo file XML.
Quello che sto dicendo dall'inizio e' che il formato che vorresti ottenere nel primo post e' dispendioso per te e inutile per chi dovra' poi leggerlo.

TorpedoBlu
04-07-2008, 11:50
Ci sono tanti modi di realizzare un XML, ma non lo farei sicuramente usando i linguaggi imperativi dei database come il TSQL o il PL/SQL se e' questo che stai chiedendo.
Dal database estrarrei i dati che mi servono, e con un linguaggio tipo C#, Python o altri realizzerei la presentazione XML.

Comunque la complessita' realizzativa sarebbe la stessa anche in TSQL o PL/SQL, se non che hai molti meno strumenti a disposizione e la la leggibilita' del codice che ne segue e' davvero ridotta.

Ma prima di tutto, prima di decidere come scrivere l'XML, devi veramente decidere COSA scrivere. Ovvero il formato del tuo file XML.
Quello che sto dicendo dall'inizio e' che il formato che vorresti ottenere nel primo post e' dispendioso per te e inutile per chi dovra' poi leggerlo.

non lo leggerà nessuno, andrà ad essere processato in pagine web con xslt

il formato è fissato dal cliente

gugoXX
04-07-2008, 12:02
non lo leggerà nessuno, andrà ad essere processato in pagine web con xslt

il formato è fissato dal cliente


Quel formato e' una cosa che relazionalmente e' decisamente errata.
Se una persona avesse 3 indirizzi, 4 numeri telefonici, 3 conti bancari e 3 animali preferiti

invece che 3+4+3+3=13 "informazioni" quell XML avrebbe 3x4x3x3=108 record, con tutte le permutazioni possibili. A cosa serve?

TorpedoBlu
04-07-2008, 16:05
Quel formato e' una cosa che relazionalmente e' decisamente errata.
Se una persona avesse 3 indirizzi, 4 numeri telefonici, 3 conti bancari e 3 animali preferiti

invece che 3+4+3+3=13 "informazioni" quell XML avrebbe 3x4x3x3=108 record, con tutte le permutazioni possibili. A cosa serve?

infatti da quel numero di tuple impressionante io mi devo estrarre un xml come dici tu, è quello il problema.

TorpedoBlu
09-07-2008, 10:22
alla fine mi è stato commissionato di concatenare tutti i campi delle query in stringhe, e delimitare le singole query con opportuni delimitatori..

in questo modo faccio varie store procedure singole che vengono richiamate da un'unica store procedure che concatena tutti i risultati fornendo alla fine un'unica stringa.

Non discuto sulla bontà della soluzione poichè non l'ho scelta io.

Ho un problema, se un solo campo è null la stringa che rappresenta il risultato della concatenazione è null!!!

come faccio a risolvere? (senza riempire la query di IF poichè i campi sono tantissimi)

esempio:


CREATE PROCEDURE PROVA_ASSEGNI(IN parametro1 INTEGER, IN parametro2 VARCHAR(20), OUT TAG_ASSEGNI VARCHAR(20000))
LANGUAGE SQL

BEGIN

DECLARE ASSEGNI VARCHAR ( 20000 ) ;
SET ASSEGNI = '';

FOR
--- SELECT QUERY ASSOCIATA AL CICLO FOR ---
ASSEGNI_ROW AS
SELECT
campo1|| '|' ||
campo2|| '|' ||
campo3 as ASSEGNO
FROM tabella.ASSEGNI
WHERE ....

--- OGNI TUPLA è CIRCONDATA DAL SUO TAG
DO SET ASSEGNI=CONCAT(ASSEGNI, ('<Assegno>'||ASSEGNI_ROW.ASSEGNO||'</Assegno>'));
END FOR;

-- RISULTATO DELLA SP ---
SET TAG_ASSEGNI = ('<Assegni>'||ASSEGNI||'</Assegni>');

END



che mi da una stringa tipo :
<assegni><assegno>campo1|campo2|campo3</assegno><assegno>campo1|campo2|campo3</assegno></assegni>

ma se un solo campo è null... la stringa risultante è null....


evidentemente la concatenazione non posso farla direttamente nella select.....

come si fa a scorrere i campi della query iterativamente e controllare che non siano null?

TorpedoBlu
10-07-2008, 08:18
certo che è proprio strano che non si possano scorrere le colonne
risultanti di una select...pensavo che finissero comunque in un array
(o qualcosa di simile) la cosa mi sorprende.... e mi sverva visto che
devo costruire una procedura ad hoc per ogni tabella.....

banryu79
10-07-2008, 08:39
Ciao,
senti ma prima di concatenare le stringhe risultanti dalla Select non si può andare a iterare il Result Set della query per gestire il caso in cui un campo stringa sia nullo?

TorpedoBlu
10-07-2008, 08:52
Ciao,
senti ma prima di concatenare le stringhe risultanti dalla Select non si può andare a iterare il Result Set della query per gestire il caso in cui un campo stringa sia nullo?

è esattamente quello che vorrei fare e che sto chiedendo, se sai come si fa...

banryu79
10-07-2008, 09:01
So farlo ma nel modo classico: ovvero lato applicativo, tramite query passate al DBMS del caso da codice sorgente, quindi con metodi di oggetti che tornano come risultato un oggetto ResultSet iterabile.

Da SQL via Stored Procedure (quindi, se non erro, da dentro il contesto del DBMS) no, non l'ho mai fatto.

TorpedoBlu
10-07-2008, 09:13
So farlo ma nel modo classico: ovvero lato applicativo, tramite query passate al DBMS del caso da codice sorgente, quindi con metodi di oggetti che tornano come risultato un oggetto ResultSet iterabile.

Da SQL via Stored Procedure (quindi, se non erro, da dentro il contesto del DBMS) no, non l'ho mai fatto.

il problema è proprio quello.... come diavolo si fa....

ceschi
10-07-2008, 15:07
Ciao, puoi usare usare ISNULL()
SELECT ISNULL(campo1, '')+ISNULL(campo2, '') etc.

:D

TorpedoBlu
10-07-2008, 16:42
Ciao, puoi usare usare ISNULL()
SELECT ISNULL(campo1, '')+ISNULL(campo2, '') etc.

:D

ragazzi, quello l'ho gia risolto, si usa la funzione

value(nomecampo, (valore in caso di campo null) )


il mio problema è scorrere le colonne con un ciclo senza riferire al loto nome, ho tabelle di decine di colonne, e vorrei scorrere per controllare ogni colonna con un'unica istruzione in un ciclo.

non esiste un fetch che mi mette tutto in un array?

malocchio
10-07-2008, 16:55
Ho trovato questo in una ricerca google. Usa un cursore e io non me ne intendo, ma forse l'idea di leggere da information_schema non è male:


declare col cursor for
select column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'NOME_TABELLA'
open col
fetch next from col into @column_name
while @@FETCH_STATUS =0
begin

TorpedoBlu
10-07-2008, 19:01
Ho trovato questo in una ricerca google. Usa un cursore e io non me ne intendo, ma forse l'idea di leggere da information_schema non è male:


declare col cursor for
select column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'NOME_TABELLA'
open col
fetch next from col into @column_name
while @@FETCH_STATUS =0
begin

interessante, forse è proprio questa la soluzione che cercavo! vediamo se trovo il modo di utilizzare questa procedura per scorrere le colonne di una query (per ogni riga si intende)

chi mi vuole dare una mano è ben accetto, potrebbe essere utile anche ad altri prima o poi.

TorpedoBlu
11-07-2008, 08:13
in realtà quando provo la query

select column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'NOME_TABELLA' (con il nome della mia tabella)

non mi restituisce nulla... può essere che in db2 sia diverso?

malocchio
11-07-2008, 08:48
in realtà quando provo la query

select column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'NOME_TABELLA' (con il nome della mia tabella)

non mi restituisce nulla... può essere che in db2 sia diverso?

Sì, INFORMATION_SCHEMA dovrebbe essere specifico di MySQL, ma tutti i DBMS hanno un database che contiene questo tipo di informazioni. Prova a documentarti sul DB2.



Azz... che ideona: esegui una query DESCRIBE TABLE sulle tabelle di cui vuoi sapere i nomi delle colonne.. quello dovrebbe essere SQL standard!

ceschi
11-07-2008, 09:03
in realtà quando provo la query

select column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'NOME_TABELLA' (con il nome della mia tabella)

non mi restituisce nulla... può essere che in db2 sia diverso?


Può essere, in SQL2005 funziona, anche i cursori non so se funzionano in db2

comunque se ho capito quello che vuoi fare, prova questo

DECLARE
@colonna varchar(50),
@StrSQL varchar(8000)

DECLARE MioCursore CURSOR FOR
SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MiaTabella'

Open MioCursore

FETCH NEXT FROM MioCursore INTO @Colonna

WHILE @@FETCH_Status = 0
BEGIN
SET @StrSQL = 'SELECT '+@colonna+' FROM MiaTabella'
Exec(@StrSQL)

FETCH NEXT FROM MioCursore INTO @Colonna
END

Close MioCursore
Deallocate MioCursore

gugoXX
11-07-2008, 09:11
La strada comunque non e' quella.
Una volta che hai i nomi delle colonne cosa vorresti farci?

La strada e' andare su un linguaggio a piu' alto livello, come Python, C#, JAva, etc., interrogare da li' il DB e scrivere da li' l'output XML.

Per ottenere il tuo output e' sufficiente una query per ogni tabella.
Ma lo stai facendo per lavoro? Non hai un collega che possa indirizzarti? Mi sembra che stia andando un po' alla cieca.

TorpedoBlu
11-07-2008, 09:36
Può essere, in SQL2005 funziona, anche i cursori non so se funzionano in db2

comunque se ho capito quello che vuoi fare, prova questo

DECLARE
@colonna varchar(50),
@StrSQL varchar(8000)

DECLARE MioCursore CURSOR FOR
SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MiaTabella'

Open MioCursore

FETCH NEXT FROM MioCursore INTO @Colonna

WHILE @@FETCH_Status = 0
BEGIN
SET @StrSQL = 'SELECT '+@colonna+' FROM MiaTabella'
Exec(@StrSQL)

FETCH NEXT FROM MioCursore INTO @Colonna
END

Close MioCursore
Deallocate MioCursore




dunque sono sulla strada giusta, ma non mi fa l'Exec, forse non c'è in db2...

malocchio
11-07-2008, 09:42
dunque sono sulla strada giusta, ma non mi fa l'Exec, forse non c'è in db2...

Una bella fregatura lavorare su DBMS diversi... non saprei dirti, se non funzia l'EXEC è un bel casino...


Si rende inutile anche DESCRIBE TABLE così :mc: :mc:

TorpedoBlu
11-07-2008, 09:47
Una bella fregatura lavorare su DBMS diversi... non saprei dirti, se non funzia l'EXEC è un bel casino...


Si rende inutile anche DESCRIBE TABLE così :mc: :mc:

dunque io ho la lista dei nomi delle colonne, ora devo poterla utilizzare...

ho questa


DO SET ASSEGNI=CONCAT
(ASSEGNI, ('<campo>'||ROW.nomecampo||'</campo>'));


e devo fare in modo che nome campo sia il nome della colonna da prendere....

come si fa a fare l'eval della stringa colonna in modo da utilizzarla in nome campo?

o meglio come si fa a definire un'istruzione sql attraverso l'interpretazione di una stringa??

malocchio
11-07-2008, 09:55
dunque io ho la lista dei nomi delle colonne, ora devo poterla utilizzare...

ho questa


DO SET ASSEGNI=CONCAT
(ASSEGNI, ('<campo>'||ROW.nomecampo||'</campo>'));


e devo fare in modo che nome campo sia il nome della colonna da prendere....

come si fa a fare l'eval della stringa colonna in modo da utilizzarla in nome campo?

o meglio come si fa a definire un'istruzione sql attraverso l'interpretazione di una stringa??

Penso che questo faccia proprio al caso tuo :D :D :D
http://bytes.com/forum/post2534936-2.html

Quindi un bel 'EXECUTE IMMEDIATE'. Altro che EXEC.. Qui si parla di EXECUTE IMMEDIATE....!!! Che roba ragazzi... :mbe:


ps. è bastata una ricerca su google (query+string+exec+db2)

ciau...

TorpedoBlu
11-07-2008, 10:10
Penso che questo faccia proprio al caso tuo :D :D :D
http://bytes.com/forum/post2534936-2.html

Quindi un bel 'EXECUTE IMMEDIATE'. Altro che EXEC.. Qui si parla di EXECUTE IMMEDIATE....!!! Che roba ragazzi... :mbe:


ps. è bastata una ricerca su google (query+string+exec+db2)

ciau...


Ci ho provato prima ma non va, mi sa che vuole per forza una query, non capisco.. mi dice che non trova la token assegni

malocchio
11-07-2008, 10:18
Ci ho provato prima ma non va, mi sa che vuole per forza una query, non capisco.. mi dice che non trova la token assegni

:what: :boh: :sob:

Strano, ma è giusta la stringa sì?

Potresti essere più preciso?

TorpedoBlu
11-07-2008, 10:24
:what: :boh: :sob:

Strano, ma è giusta la stringa sì?

Potresti essere più preciso?

SET QUERY = 'SET ASSEGNI=CONCAT(ASSEGNI, (ASSEGNI_ROW.ASSEGNO));';

EXECUTE IMMEDIATE QUERY;

giusto per provare ad eseguire una stringa....

mi da errore execute immediate, dicendomi che query è token non previsto

malocchio
11-07-2008, 10:29
SET QUERY = 'SET ASSEGNI=CONCAT(ASSEGNI, (ASSEGNI_ROW.ASSEGNO));';

EXECUTE IMMEDIATE QUERY;

giusto per provare ad eseguire una stringa....

mi da errore execute immediate, dicendomi che query è token non previsto

Può essere che QUERY sia un parola riservata e non la puoi utilizzare per i nomi di variabile?? Prova a cambiare nome...

TorpedoBlu
11-07-2008, 10:39
Può essere che QUERY sia un parola riservata e non la puoi utilizzare per i nomi di variabile?? Prova a cambiare nome...

dovevo dichiararla in testa..

cmq mi dice che non trova ASSEGNI ...

TorpedoBlu
11-07-2008, 10:48
non so, c'è qualcosa che fa a cazzotti, oppure non posso richiamare variabili all'interno della stringa da eseguire... a me non serve eseguire un'isrtuzione.... cavolo mi basterebbe riconoscere una stringa come un nome variabile (un eval(nomecampo) ) e sarei a posto..

TorpedoBlu
11-07-2008, 10:52
non so, c'è qualcosa che fa a cazzotti, oppure non posso richiamare variabili all'interno della stringa da eseguire... a me non serve eseguire un'isrtuzione.... cavolo mi basterebbe riconoscere una stringa come un nome variabile (un eval(nomecampo) ) e sarei a posto..


in alternativa se mi trovate un modo per avere un risultato verticale di una select :

nomecampo1|valore
nomecampo2|valore
nomecampo3|valore

io poi sono a posto... ma anche qui se ho più righe di risultato....

malocchio
11-07-2008, 11:05
in alternativa se mi trovate un modo per avere un risultato verticale di una select :

nomecampo1|valore
nomecampo2|valore
nomecampo3|valore

io poi sono a posto... ma anche qui se ho più righe di risultato....

Boh, guarda, io mi sono perso a metà strada... e poi non conosco a fondo le strutture dell'SQL...

TorpedoBlu
13-07-2008, 22:25
dunque il mio problema ora si sta spostando.

dalle tabelle di sistema riesco a fare una query che mi restituisce i nomi delle colonne della mia tabella.

ora devo utilizzare tali nomi per scorrere le colonne che formano il risultato della mia query.

il problema che ho davanti sembra abbastanza semplice, ho una lista di stringhe che rappresentano i nomi delle colonne che proviene da:

select column_name FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'NOME_TABELLA' (con il nome della mia tabella)

e devo usare questi nomi per scorrere il risultato di

SELECT CAMPO1, CAMPO2, CAMPO3 FROM NOME_TABELLA WHERE CONDIZIONI

attraverso un ciclo e concatenare tutti i risultati (dopo averli puliti, controllato valori nulli ecc..) per costruire una stringa del tipo


<nome_tabella><campo1>valore</campo1><campo2>valore</campo2><campo3>valore</campo3></nome_tabella>


questo lo potrei fare con ciclando la lista dei campi per prendermi il nome_campo.... ma è una stringa....

SET risultato=CONCAT(risultato, (row.nome_campo));

ma nome campo deve essere preso dalla lista delle colonne della prima query e non riesco...

TorpedoBlu
14-07-2008, 08:58
up