PDA

View Full Version : [SQL] - Differenza tra tabelle


SaW
18-01-2012, 14:54
Ciao ragazzi,
mi serve una mano per costruire una query SQL in Access.
Ho due tabelle importate da Excel e ho bisogno di costruire una query che, dati 2 valori in ingresso, mi deve dare una tabella con tutti i campi che differiscono.
La soluzione che mi era venuta in mente era quella di creare una prima query che mi da come risultato tutti i campi richiesti dalla prima tabella, creare una seconda query che mi da come risultato tutti i campi richiesti dalla seconda tabella e unirle insieme in una terza tabella.
Poi su questa terza tabella effettuare la differenza.

Non so se è una cosa fattibile/sensata, voi come la vedete?
Se è fattibile come la realizzereste?

Grazie

daxdaxdax
18-01-2012, 16:20
Si, non ho capito molto da cosa devono essere diversi i record ma immagino che non ci debbano essere "doppioni". Se così fosse si potrebbe unire le tabelle e fare una select distinct..

demos88
18-01-2012, 16:35
Ciao ragazzi,
mi serve una mano per costruire una query SQL in Access.
Ho due tabelle importate da Excel e ho bisogno di costruire una query che, dati 2 valori in ingresso, mi deve dare una tabella con tutti i campi che differiscono.
La soluzione che mi era venuta in mente era quella di creare una prima query che mi da come risultato tutti i campi richiesti dalla prima tabella, creare una seconda query che mi da come risultato tutti i campi richiesti dalla seconda tabella e unirle insieme in una terza tabella.
Poi su questa terza tabella effettuare la differenza.

Non so se è una cosa fattibile/sensata, voi come la vedete?
Se è fattibile come la realizzereste?

Grazie
Ma i campi devono differire da cosa?
E le due tabelle sono joinabili (hanno un attributo dello stesso tipo che ha senso usare come attributo di join) ?

SaW
19-01-2012, 10:02
Praticamente ho due file excel, uno di base e uno aggiornato con alcune informazioni che vengono ereditate dal file di base e altre informazioni modificate.
Attualmente si va a confrontare i due file manualmente e si cercano le differenze, io sto cercando di creare una query che dati in ingresso i due codici (uno del file di base e uno del file aggiornato), mi restituisca in automatico la tabella con le differenze.
Ho provato ad utilizzare il JOIN ma mi sono poi accorto che le tabelle non hanno lo stesso numero di colonne.

demos88
19-01-2012, 13:38
Praticamente ho due file excel, uno di base e uno aggiornato con alcune informazioni che vengono ereditate dal file di base e altre informazioni modificate.
Attualmente si va a confrontare i due file manualmente e si cercano le differenze, io sto cercando di creare una query che dati in ingresso i due codici (uno del file di base e uno del file aggiornato), mi restituisca in automatico la tabella con le differenze.
Ho provato ad utilizzare il JOIN ma mi sono poi accorto che le tabelle non hanno lo stesso numero di colonne.
Non serve che abbiano lo stesso numero di colonne, basta che ne abbiano una che sia concettualmente utilizzabile come attributo del join, per esempio un id, che identifica univocamente la tupla (la riga), così da andare a comparare fra loro righe con id uguale.
Se le tabelle sono di questo tipo (uso lo schema logico relazionale):
TabellaA(id, campo1, campo2, campo3)
TabellaB(id, campo1, campo2, campo3, campo4)
Puoi fare una query del tipo:
SELECT * FROM TabellaA a JOIN TabellaB b ON a.id = b.id WHERE a.campo1!=b.campo1 OR a.campo2 != b.campo2 OR a.campo3 != b.campo3;
Questa query confronta le righe delle tue tabelle che hanno id uguale fra loro e riporta tutti gli attributi di entrambe le tabelle per quelle righe che differiscono in almeno uno degli attributi campo1, campo2, campo3.
E' questo quello che ti serviva?

SaW
23-01-2012, 09:31
Scrivendo la query come mi hai suggerito tu mi da un 'errore di sintassi nella proposizione FROM' e mi evidenzia il "JOIN".
Se provo ad utilizzare "INNER JOIN" mi da un 'errore di sintassi (operatore mancante) nell'espressione della query' e mi evidenzia il simbolo di diverso (!=).

demos88
23-01-2012, 13:02
Scrivendo la query come mi hai suggerito tu mi da un 'errore di sintassi nella proposizione FROM' e mi evidenzia il "JOIN".
Se provo ad utilizzare "INNER JOIN" mi da un 'errore di sintassi (operatore mancante) nell'espressione della query' e mi evidenzia il simbolo di diverso (!=).
mah... su mysql 5.5 funziona perfettamente...
prova a esplicitare la ridenominazione (aggiungendo gli 'AS') e imporre un LEFT JOIN:
SELECT * FROM TabellaA AS a LEFT JOIN TabellaB AS b ON a.id = b.id WHERE a.campo1 <> b.campo1 OR a.campo2 <> b.campo2 OR a.campo3 <> b.campo3;
Io tipicamente uso postgres o mysql, access l'ultima (e unica) volta che l'ho usato è stato alle superiori... potrebbero esserci delle imprecisioni di sintassi, ma dal punto di vista logico dovrebbe essere giusto.

EnricoHU
23-01-2012, 15:51
se non si ricorda la sintassi delle istruzioni SQL da includere nel codice VBA, basta creare una query e poi visualizzarla come SQL

in caso di ulteriori difficoltà si può usare la creazione guidata ...

ciao

SaW
31-01-2012, 14:09
Allora ragazzi ho maggiori informazioni riguardanti il mio problema, vediamo se riusciamo a fare un po' di chiarezza.

La LEFT JOIN va bene per quello che sto cercando fino a un certo punto.

Praticamente la LEFT JOIN va a prendere tutti i record della prima tabella ed estrae tutti i record della seconda tabella che trovano una corrispondenza nella prima. Per quelli che non hanno corrispondenza la LEFT JOIN mi mostrerà NULL.

A me serve come risultato una tabella che mi mostri soltanto i record che differiscono tra le due, quindi non tutti i record della prima tabella con quelli della seconda che hanno trovato corrispondenza o NULL ma soltanto quelli che danno NULL in quanto sono quelli che differiscono dalla prima.

Non so se mi sono spiegato...so di per certo che con altri DB la MINUS fa già in automatico questa cosa. Probabilmente bisognerebbe usare una query annidata come clausola della LEFT JOIN?

La query che ho al momento è la seguente:

SELECT (vari nomi dei campi)
FROM Tabella1 LEFT JOIN Tabella2
ON Tabella1.CODE = Tabella2.CODE
WHERE Tabella1.oldcode=[Inserisci oldcode:] AND Tabella2.newcode=[Inserisci il newcode:]

Dopo aver dato i due valori di input, che quindi fanno da filtro per tutti i valori nelle tabelle, ottengo una tabella abbastanza grossa (più di mille record) mentre invece come risultato dovrei ottenere una tabella con 4 record.

demos88
31-01-2012, 21:00
Continuo a non capire... anche perchè una query fatta così non riesco a trovarle un significato (magari il database potrebbe essere strutturato meglio?).
Fai prima a fare un esempio, scrivici qualche record esemplificativo per ogni tabella e poi l'esito atteso della query che ti serve.

SaW
01-02-2012, 08:51
Non è un vero e proprio database, sono due grossi file Excel importati con la funzione di Access per caricare dati esterni.
Come già detto, dati due valori di input inseriti dall'utente ('oldcode' e 'newcode' scritti nella query del messaggio precedente), la query mi deve restituire le differenze che caratterizzano questi due codici.

Date due tabelle molto grosse, e dati due valori in input che filtrano e mi creano due tabelle più piccole, ho bisogno di fare la differenza tra queste due tabelle per ottenere le differenze.

Scrivendo la query su db Oracle utilizzando la MINUS l'operazione è semplicissima e il risultato ottenuto è giusto. La MINUS mi fa proprio la differenza tra le tabelle e mi restituisce solo la differenza tra le due.
Non riesco a capire perchè su Access non c'è una funzione esattamente uguale alla MINUS.

demos88
01-02-2012, 13:59
Se fornissi un esempio sarebbe tutto più chiaro, non riesco ancora a capire.
Comunque l'equivalente di MINUS (Oracle), nello standard SQL dovrebbe essere l'operatore EXCEPT DISTINCT (http://en.wikipedia.org/wiki/Set_operations_%28SQL%29#EXCEPT_operator)
Prova a darci un occhio