Newsgroup: it.comp.software.database
Titolo: Problema con query, mi aiutate??

Ciao a tutti,
Ho una tabella che contiene una serie di dati anagrafici di soggetti
organizzati nei seguenti campi:
id; parent_id; fieldname; vcfield;
Il campo fieldname contiene la tipologia del dato, es: indirizzo, cap,
regione, numero civico, numero di telefono.
Il campo vcfield contiene il valore del campo descritto in fieldname.
Il campo parent_id contiene un valore numerico uguale e univoco per
tutti i record appartenenti allo stesso soggetto;
Quindi un esempio di record relativi ad un singolo soggetto è il
seguente:
1050; 345; denominazione; pinco pallino;
1051; 345; numero_telefono; 0600004;
1052; 345; indirizzo; via pallino;
1053; 345; numero_civico; 33;
1054; 345; email; 
pinco.pall...@xxx.cx
;
Ho necessità di creare una query per ottenere su una sola riga tutti i
dati del soggetto. Quindi in riferimento all'esempio precedente:
345; pinco pallino; 0600004; via pallino; 33; 
pinco.pall...@xxx.cx
;
Mi date una mano? Ce l'ho messa tutta ma non ci sono proprio riuscito.
Grazie mille!!!

 Mi date una mano? Ce l'ho messa tutta ma non ci sono proprio riuscito.
Se il numero di campi e i valori di fieldname sono noti puoi fare 
diverse JOIN con rinominazione, del tipo
SELECT A1.vcfield, A2.vcfield, A3.vcfield, A4.vcfield, A5.vcfield
   FROM Anonima AS A1
   JOIN Anonima AS A2 ON A2.parent_id=345 and
      A2.fieldname='numero_telefono'
   JOIN Anonima AS A3 ON A3.parent_id=345 and A3.fieldname='indirizzo'
   JOIN Anonima AS A4 ...
   WHERE A1.parent_id=345 and A1.fieldname='denominazione';
Sarebbe meglio anche cambiare la struttura della tabella dividendola, se 
crei una vista con questo modo puoi creare direttamente la nuova 
tabella, ma viene il dubbio che questa struttura serva per essere 
"flessibile" cioč per aggiungere campi a piacere in un qualsiasi momento.

 "flessibile" cioè per aggiungere campi a piacere in un qualsiasi momento.
Grazie 1000, in effetti la struttura è stata studiata per essere
flessibile, ma ora mi trovo a dover compattare la tabella indicando su
un solo record tutti i possibili valori di un parent_id
(numero_telefono, numero_civico, indirizzo, ecc..)
La tua soluzione non posso praticarla perchè i record sono circa
300.000 e non posso quindi inserire manualmente tutti i parent_id che
identificano lo stesso gruppo di appartenenza dei valori in vcfield
descritti da fieldname.
Pensavo che ci fosse qualche comando sql che permettesse di poter
raggruppare dati di più righe su una riga sola relazionando i dati
tramite uno specifico valore che nel mio caso è parent_id

 
Verifica se il tuo DBMS supporta il PIVOT

 descritti da fieldname.
Fai una select per vedere i valori differenti di fieldname e costruisci 
usandoli tutti.
A occhio usando il RIGHT JOIN otterrai una tupla completa di tutti i 
campi eventualmente con dei valori vuoti.

 tramite uno specifico valore che nel mio caso è parent_id
Dipende da che db usi.
Con postgresql puoi creare una funzione di aggregazione di questo
tipo:
CREATE AGGREGATE textcat_all(
  BASETYPE=text,
  SFUNC=textcat,
  STYPE=text
);
ALTER AGGREGATE textcat_all(text) OWNER to xyz;
E poi usarla come se facessi una SUM concatenando i campi di testo.
textcat_all(nomecampo || ', ') per separare anche i campi con una
virgola.
Lucazeo

 vcfield descritti da fieldname.
E questo non e` che l'inizio dei problemi che sorgeranno.
A fare l'EAV son tutti contenti all'inizio perche` in fase di
creazione si risparmia tanto tempo.
Poi in fase di recupero iniziano le prime difficolta`.
Il bagno di sangue e` nell'integrita`, e nella eventuale
ristrutturazione di quando ci si rendera` conto di usare un
dbms come fosse un word processor.
Non e` solo nei database relazionali che dati e metadati
sono trattati differentemente, ed il motivo lo si scoprira'
non appena il db comincia ad essere serio.
PS: il multipost e` male!
Pensa a quei poracci su free.it.comp.database.mysql che
si scervellano mentre qui ci son state tante succulente
discussioni sull'argomento in passato...