Unione condizionato di due tabelle

lunedì 03 novembre 2008 - 09.46

jampicoll Profilo | Junior Member

Ciao a tutti,
ho bisogno del vostro aiuto....vi spiego il problema.
DB : MS ACCESS
Ho due tabelle con struttura identica
MACCHINA ID:contatore
Anagrafica ID:numerico
MACCHINA TIPO: testo
MACCHINA MARCA: testoù
MACCHINA GESTORE: testo
MACCHINA ATTIVA: si/no

Le due tabelle sono strutturate in modo identico ma contengono dati in parte differente.
Vorrei fare in modo che partendo da una delle due tabelle, riuscire ad inserire i record che no sono uguali cioè:
Partendo dalla tabella 1 come esistente, e scorrendo la tabella 2, vorrei inserire nella tabella 1 le righe di tabella 2 che hanno un valore di Anagrafica ID non presente in tabella 1.

ES:

Partendo da queste tabelle:

Tab 1
MACCHINA ID ANAGRAFICA ID MACCHINA TIPO
------1------------------10----------------<VALORE>
------2------------------24----------------<VALORE>
------3------------------35----------------<VALORE>


Tab 2
MACCHINA ID ANAGRAFICA ID MACCHINA TIPO
------1------------------11----------------<VALORE>
------2------------------24----------------<VALORE>
------3------------------40----------------<VALORE>

Vorrei avere come risultato questa tabella:

MACCHINA ID ANAGRAFICA ID MACCHINA TIPO
------1------------------10----------------<VALORE>
------2------------------11----------------<VALORE>
------3------------------24----------------<VALORE>
------4------------------35----------------<VALORE>
------5------------------40----------------<VALORE>


Cioè inserire tutti i valori che contengono un Anagrafica ID "nuova"

Spero mi possiate aiutare.

CIAO.


Stroke Profilo | Junior Member

insert into Tab1 (campo1,campo2,Campon) (select campo1, campo2, campon from Tab2 where campo1 not in (select Campo1 from Tab1))
Credo che così possa funzionare.
ciao
Furio
http://www.opsi.ws

lbenaglia Profilo | Guru

>Partendo dalla tabella 1 come esistente, e scorrendo la tabella
>2, vorrei inserire nella tabella 1 le righe di tabella 2 che
>hanno un valore di Anagrafica ID non presente in tabella 1.

Ciao Giampiero,

Ti allego un esempio per SQL Server per essere chiari, anche se il comando di INSERT dovrebbe essere compatibile con Access:

USE tempdb; CREATE TABLE dbo.Tab1( MacchinaID int NOT NULL IDENTITY PRIMARY KEY, AnagraficaID int NOT NULL, Tipo varchar(10) NOT NULL, Marca varchar(10) NOT NULL, Gestore varchar(10) NOT NULL, Attività bit NOT NULL ); CREATE TABLE dbo.Tab2( MacchinaID int NOT NULL IDENTITY PRIMARY KEY, AnagraficaID int NOT NULL, Tipo varchar(10) NOT NULL, Marca varchar(10) NOT NULL, Gestore varchar(10) NOT NULL, Attività bit NOT NULL ); INSERT dbo.Tab1 VALUES(10, 'Tipo1', 'Marca1', 'Gestore1', 1) , (24, 'Tipo2', 'Marca2', 'Gestore3', 0) , (35, 'Tipo3', 'Marca3', 'Gestore3', 1); INSERT dbo.Tab2 VALUES(11, 'Tipo4', 'Marca4', 'Gestore4', 1) , (24, 'Tipo2', 'Marca2', 'Gestore3', 0) , (40, 'Tipo5', 'Marca5', 'Gestore5', 1); INSERT dbo.Tab1(AnagraficaID, Tipo, Marca, Gestore, Attività) SELECT AnagraficaID, Tipo, Marca, Gestore, Attività FROM dbo.Tab2 AS T2 WHERE NOT EXISTS( SELECT * FROM dbo.Tab1 WHERE T2.AnagraficaID = AnagraficaID ); SELECT * FROM dbo.Tab1 ORDER BY AnagraficaID; /* Output: MacchinaID AnagraficaID Tipo Marca Gestore Attività ----------- ------------ ---------- ---------- ---------- -------- 1 10 Tipo1 Marca1 Gestore1 1 4 11 Tipo4 Marca4 Gestore4 1 2 24 Tipo2 Marca2 Gestore3 0 3 35 Tipo3 Marca3 Gestore3 1 5 40 Tipo5 Marca5 Gestore5 1 (5 row(s) affected) */ DROP TABLE dbo.Tab1, dbo.Tab2;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

jampicoll Profilo | Junior Member

Ho provato in questo modo:

INSERT INTO MACCHINECT ( MACCHINECT.[Anagrafica ID], MACCHINECT.[MACCHINA TIPO], MACCHINECT.[MACCHINA MARCA], MACCHINECT.[MACCHINA GESTORE], MACCHINE.[MACCHINA attiva] )
SELECT MACCHINE.[Anagrafica ID], MACCHINE.[MACCHINA TIPO], MACCHINE.[MACCHINA MARCA], MACCHINE.[MACCHINA GESTORE], MACCHINE.[MACCHINA attiva]
FROM MACCHINE
WHERE MACCHINE.[Anagrafica ID] NOT IN (
SELECT MACCHINECT.[Anagrafica ID]
FROM MACCHINECT);

Ma mi da errore:
L'istuzione INSERT INTO contiene il seguente campo nome sconosciuto "MACCHINECT.Anagrafica ID".
Il campo però è corretto, Forse sbaglio nella gestione delle parentesi???

lbenaglia Profilo | Guru

>INSERT INTO MACCHINECT ( MACCHINECT.[Anagrafica ID], MACCHINECT.[MACCHINA
>TIPO], MACCHINECT.[MACCHINA MARCA], MACCHINECT.[MACCHINA GESTORE],
>MACCHINE.[MACCHINA attiva] )

Occhio, sostituisci a MACCHINE.[MACCHINA attiva] il valore MACCHINECT.[MACCHINA attiva] o ancora meglio semplifica il comando di insert in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ad ogni modo con molta probabilità otterrai un piano di esecuzione più efficiente utilizzando la clausola EXISTS...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

jampicoll Profilo | Junior Member

Il codice sembra perfetto ma stranamente non fa nessun nuovo inserimento, come se non trovasse differenze.
Se per te non è un problema ti vorrei inviare il db in allegato
Se mi da l'ok te lo invio subito.

lbenaglia Profilo | Guru

>Se per te non è un problema ti vorrei inviare il db in allegato
>Se mi da l'ok te lo invio subito.
Zippa l'mdb ed allegalo ad un nuovo post.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

jampicoll Profilo | Junior Member

ok. fatto.

Grazie in anticipo.

lbenaglia Profilo | Guru

>ok. fatto.
Utilizza questa query:

INSERT INTO MACCHINECT ( [Anagrafica ID] , [MACCHINA TIPO] , [MACCHINA MARCA] , [MACCHINA GESTORE] , [MACCHINA attiva] ) SELECT M.[Anagrafica ID] , M.[MACCHINA TIPO] , M.[MACCHINA MARCA] , M.[MACCHINA GESTORE] , M.[MACCHINA attiva] FROM MACCHINE AS M LEFT JOIN MACCHINECT AS MCT ON M.[Anagrafica ID] = MCT.[Anagrafica ID] WHERE MCT.[Anagrafica ID] IS NULL;

Occhio che in MACCHINE hai una riga con [Anagrafica ID] valorizzato a NULL.

>Grazie in anticipo.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

jampicoll Profilo | Junior Member

Adesso funziona perfettamente.
TI ringrazio come sempre.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5