Newsgroup: it.comp.lang.perl
Titolo: Comparazione tabelle

Ciao,
ho questo problema, devo comparare due tabelle mysql con la medesima
struttura, e devo ricavarne una terza contenente le righe che sono state
modificate.
naturalmente in perl
Come fare?
Grazie
SIMONE

 writes:
Simoooone> Ciao, ho questo problema, devo comparare due tabelle mysql
Simoooone> con la medesima struttura, e devo ricavarne una terza
Simoooone> contenente le righe che sono state modificate.
Simoooone> naturalmente in perl Come fare?
nel passaggio dall'insieme (ossia tabela) A all'insieme B
eliminazioni(A,B) = A - B
aggiunte(A,B) =  B - A
differenze(A,B) = (A - B) U (B - A)
con mysql (ma anche con oracle potresti) e DBI per perl
una query che usi  SUBTRACT e UNION di SELECT a seconda di quello che
effettivamente ti interessa estrarre, e` il modo migliore.
Se invece l'estrazione non e` semplificabile dal comando di estrazione,
e devi effettuare il confronto in memoria con perl, l'istruzione grep
fa a caso tuo, ricordati che in un { blocco ; di ; istruzioni }
e` l'ultima quella che restituisce il risultato.
Simoooone> Grazie SIMONE
Saluti,
MARco
-- 
 
http://mar.i.am
x(t),y(t) = th(3t-34.5)*e^[-(3t-34.5)^2]/2-4.3+e^(-1.8/t^2)/(.8*atg(t-
3)+2)(t-1.8)-.3th(5t-42.5),(1.4e^[-(3t-34.5)^2]+1-sgn[|t-8.5|-.5]*1.5*
|sin(pi*t)|^[2e^(-(t-11.5)^2)+.5+e^(-(.6t-3.3)^2)])/(.5+t)+1  ; 0<t<14

 effettivamente ti interessa estrarre, e` il modo migliore.
io ho due tabelle
Tabella1            Tabella2
id                       id
tipo                    tipo
descrizione         descrizione
devo fare una query che mi faccia la comparazione di tutti i campi tranne
del campo id e che metta nella Tabella3 la riga variata prendendola dalla
tabella2.
Come posso scriverla???
Grazie TANTE
SIMONE

 writes:
Simoooone> > nel passaggio dall'insieme (ossia tabela) A all'insieme B
Simoooone> > eliminazioni(A,B) = A - B > aggiunte(A,B) = B - A >
Simoooone> differenze(A,B) = (A - B) U (B - A)
Simoooone> >
Simoooone> > con mysql (ma anche con oracle potresti) e DBI per perl >
Simoooone> una query che usi SUBTRACT e UNION di SELECT a seconda di
Simoooone> quello che > effettivamente ti interessa estrarre, e` il
Simoooone> modo migliore.
Simoooone> io ho due tabelle
Simoooone> Tabella1 Tabella2
Simoooone> id id
Simoooone> tipo tipo
Simoooone> descrizione descrizione
Simoooone> devo fare una query che mi faccia la comparazione di tutti
Simoooone> i campi tranne del campo id e che metta nella Tabella3 la
Simoooone> riga variata prendendola dalla tabella2.  Come posso
Simoooone> scriverla???
Simoooone> Grazie TANTE SIMONE
Ti dico come potresti fare con oracle,
ho visto che mysql ha si` UNION ma non ha SUBTRACT,
per scovare le differenze di insiemi, intese come
 (aggiunte XOR eliminazioni)
ma per le modiriche c'e` la possibilita` di comparare
condizionatamente tutte le combinazioni delle righe di piu` tabelle
(cosiddetta JOIN)
quindi se ti serve tutto credo che dovrai farlo da perl
aiutandoti con grep {}, come la seconda alternativa che ti suggerivo.
Non hai specificato vincoli di unicita` (ma immagino che ID sia primary key)
Non hai definito bene cosa intendi per "variazione" (c'e` la
cancellazione (che sembra non interessarti), l'inserimento
e la modifica, e nel caso di modifica puo` essere solo di "tipo",
di "descrizone"  o di entrambi cioe` non e` chiaro quanto fermo e` "tipo")
comunque una traccia potrebbe essere (aggiungo una colonna di
informazione M=modifica, I=inserimento, C=cancellazione in Tabela3)
MODIFY Tabella3 (ADD ragione CHAR(1));
INSERT into Tabella3 ( -- potrebbe esserci qualche parentesi di troppo
  -- la seguente select estrae i record a parita` di ID a contenuto modificato
  SELECT 
t1.id
, t2.tipo, t2.descrizione, "M" FROM Tabella1 t1, Tabella2 t2
   WHERE 
t1.id
=
t2.id
 AND (t1.tipo<>t2.tipo OR t1.descrizione<>t2.descrizione)
  -- se interessa aggiungere anche i record cancellati
  UNION (
   SELECT id, tipo, descrizione, "C" FROM Tabella1
  SUBTRACT
   SELECT id, tipo, descrizione, "C" FROM Tabella2
  )
  -- se interessa aggiungere anche i record aggiunti
  UNION (
   SELECT id, tipo, descrizione, "I" FROM Tabella2
  SUBTRACT
   SELECT id, tipo, descrizione, "I" FROM Tabella1
  )
)
La morale e` se si ha un sistema di database complesso e` meglio che
sia questo a compiere il piu` possibile di operazioni che si intendono.
Sei fortunato, per curiosita` ho voluto pensare io come tradurlo in MySQL:
INSERT into Tabella3
  SELECT 
t1.id
, t2.tipo, t2.descrizione, "M"
   FROM Tabella, Tabella2 t2
   WHERE 
t1.id
=
t2.id
 AND (t1.tipo<>t2.tipo OR t1.descrizione<>t2.descrizione)
  UNION
   SELECT 
t1.id
, t1.tipo, t1.descrizione, "C"
   FROM Tabella1 t1 LEFT JOIN Tabella2 t2 USING (id)
    WHERE 
t2.id
 IS NULL
  UNION
   SELECT 
t2.id
, t2.tipo, t2.descrizione, "I"
   FROM Tabella2 t2 LEFT JOIN Tabella1 t1 USING (id)
    WHERE 
t1.id
 IS NULL
Tieni conto che non ho verificato alcun che`,
Saluti,
MARco
-- 
 
http://mar.i.am/~u16482.65116/it.comp.lang.perl,it
