Query in vb per recupero dati in 2 tab

giovedì 19 aprile 2007 - 19.30

mortenera Profilo | Junior Member

salve
tabella1 numero nome conogme presenze
tabella 2 numero
devo fare una query di confronto e selezionare dalla tab1 tutti i record che non sono presenti nella tab 2
suggerimenti

lbenaglia Profilo | Guru

>tabella1 numero nome conogme presenze
>tabella 2 numero
>devo fare una query di confronto e selezionare dalla tab1 tutti
>i record che non sono presenti nella tab 2

Ciao mortenera,

Che DBMS utilizzi?
Con SQL Server 2005 mi vengono in mente un paio di soluzioni:

- La classica outer join;
- L'utilizzo del nuovo operatore EXCEPT con l'ausilio di una Common Table Expression.

Vediamo entrambi gli esempi:

USE tempdb; CREATE TABLE dbo.Tabella1( Numero int NOT NULL PRIMARY KEY, Nome varchar(10) NOT NULL, Cognome varchar(10) NOT NULL ); CREATE TABLE dbo.Tabella2( Numero int NOT NULL PRIMARY KEY ); INSERT dbo.Tabella1 VALUES(1, 'Lorenzo', 'Benaglia'); INSERT dbo.Tabella1 VALUES(2, 'David', 'De Giacomi'); INSERT dbo.Tabella1 VALUES(3, 'Luca', 'Bianchi'); INSERT dbo.Tabella1 VALUES(4, 'Andrea', 'Montanari'); INSERT dbo.Tabella1 VALUES(5, 'Marcello', 'Poletti'); INSERT dbo.Tabella2 VALUES(1); INSERT dbo.Tabella2 VALUES(3); INSERT dbo.Tabella2 VALUES(5); /* Outer join */ SELECT T1.* FROM dbo.Tabella1 AS T1 LEFT JOIN dbo.Tabella2 AS T2 ON T1.Numero = T2.Numero WHERE T2.Numero IS NULL; /* Operatore EXCEPT */ WITH CTE_GetNumero AS ( SELECT Numero FROM dbo.Tabella1 EXCEPT SELECT Numero FROM dbo.Tabella2 ) SELECT T1.* FROM dbo.Tabella1 AS T1 JOIN CTE_GetNumero AS CTE ON T1.Numero = CTE.Numero; /* Output: Numero Nome Cognome ----------- ---------- ---------- 2 David De Giacomi 4 Andrea Montanari (2 row(s) affected) */ DROP TABLE dbo.Tabella1, dbo.Tabella2;

Per maggiori informazioni consulta i seguenti paragrafi sui Books Online:

"Using Outer Joins"
http://msdn2.microsoft.com/en-us/library/ms187518.aspx

"EXCEPT and INTERSECT (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms188055.aspx

"Using Common Table Expressions"
http://msdn2.microsoft.com/en-us/library/ms190766.aspx

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

mortenera Profilo | Junior Member

database access
adodb per comandi

lbenaglia Profilo | Guru

>database access
>adodb per comandi

Con Access la soluzione basata sulla outer join funziona egregiamente.

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

mortenera Profilo | Junior Member

ho scritto questo codice
Mag1.Clear()
OleDbSelectCommand2.CommandText = ("SELECT insgiochi.Comma, insgiochi.Matricola, insgiochi.Id FROM insgiochi INNER JOIN installazione ON insgiochi.Matricola = installazione.matricola WHERE installazione.matricola IS NULL")
olemag.Fill(Mag1, "insgiochi")
DataGrid4.DataSource = Mag1
DataGrid4.DataMember = "insgiochi"


sul datagrid non visualizza nulla
cosa sbaglio?

lbenaglia Profilo | Guru

>sul datagrid non visualizza nulla
>cosa sbaglio?
Ah boh, non avendo il db ed un esempio completo del tuo client, quello spezzone di codice mi dice poco.
Inoltre io parlavo di OUTER JOIN NON DI INNER JOIN!

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

mortenera Profilo | Junior Member

grazie risolto era outer l'errore

mortenera Profilo | Junior Member

grazie risolto era outer l'errore

mortenera Profilo | Junior Member

in realta funziona ma non propio come vorrei

tab insgiochi 2 colonne
n d

1
2 X
2
3
4
5
6
tab intallazione 2 colonne

n dataout

1 01/01?2007
1
2
3
4
5 01/01?2007



il risultato che devo visualizzare e

n

5
6
perche 5 ha dataout not null e 6 non è presente in installazione
mi puoi aiutare

lbenaglia Profilo | Guru

>tab insgiochi 2 colonne
>n d
>
>1
>2 X
>2
>3
>4
>5
>6
>tab intallazione 2 colonne
>
>n dataout
>
>1 01/01?2007
>1
>2
>3
>4
>5 01/01?2007
>
>
>
>il risultato che devo visualizzare e
>
>n
>
>5
>6
>perche 5 ha dataout not null e 6 non è presente in installazione

Scusa, anche 1 è presente in entrambe le tabelle e ha la data NOT NULL, per quale motivo lo vuoi escludere dal result set finale?

Secondo me hai le idee alquanto confuse, ti posto questo esempio e ragionaci un po' su:

USE tempdb; CREATE TABLE dbo.insgiochi( n int NOT NULL, d char(1) NULL ); CREATE TABLE dbo.installazione( n int NOT NULL, dataout smalldatetime NULL ); INSERT dbo.insgiochi VALUES(1, NULL); INSERT dbo.insgiochi VALUES(2, 'X'); INSERT dbo.insgiochi VALUES(2, NULL); INSERT dbo.insgiochi VALUES(3, NULL); INSERT dbo.insgiochi VALUES(4, NULL); INSERT dbo.insgiochi VALUES(5, NULL); INSERT dbo.insgiochi VALUES(6, NULL); INSERT dbo.installazione VALUES(1, '20070101'); INSERT dbo.installazione VALUES(1, NULL); INSERT dbo.installazione VALUES(2, NULL); INSERT dbo.installazione VALUES(3, NULL); INSERT dbo.installazione VALUES(4, NULL); INSERT dbo.installazione VALUES(5, '20070101'); SELECT G.* FROM dbo.insgiochi AS G LEFT JOIN dbo.installazione AS I ON G.n = I.n WHERE I.n IS NULL OR I.dataout IS NOT NULL; /* Output: n d ----------- ---- 1 NULL 5 NULL 6 NULL (3 row(s) affected) */ DROP TABLE dbo.insgiochi, dbo.installazione;

Ciao!

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

mortenera Profilo | Junior Member

non ho le idee confuse e che quel numero se ha la x accanto non e detto che lo stia riutilizzando quindi se ha la x non lo devo prendere in considerazione per il confronto ma solo quelli null, stessa cosa per tab 2 se dataout e vuota vuol dire che lo devo scartare dal risultato in pratica che mi deve ristituire sono tutti i numeri non presenti in t2, e tutti i numeri che in quel momento non hanno la data out null

lbenaglia Profilo | Guru

>...in pratica che mi deve ristituire sono
>tutti i numeri non presenti in t2, e tutti i numeri che in quel
>momento non hanno la data out null

E' esattamente quello che fa il mio ultimo esempio.

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

mortenera Profilo | Junior Member

1 non deve essere visualizzato perche e stato rieinserito in t2 e quindi a data null e quello il problema che non risolvo e devo risolvero da codice

lbenaglia Profilo | Guru

>1 non deve essere visualizzato perche e stato rieinserito in
>t2 e quindi a data null e quello il problema che non risolvo
>e devo risolvero da codice

Da quello che hai postato 1 NON HA data NULL...
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mortenera Profilo | Junior Member

si la prima riga ha data out la seconda no la tabella due mi funge da archivio storico

tab intallazione 2 colonne
>
>n dataout
>
>1 01/01?2007
>1
>2
>3
>4
>5 01/01?2007

lbenaglia Profilo | Guru

>si la prima riga ha data out la seconda no la tabella due mi
>funge da archivio storico

E se avessi avuto:

1 NULL
1 01/01/2007

o

1 NULL
1 01/01/2007
1 NULL

o ancora

1 01/01/2007
1 NULL
1 02/01/2007

sarebbe cambiato qualcosa?
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mortenera Profilo | Junior Member

dei 3 esempi sono possibili solo il 1 e il 3 il secondo no, non posso trovare due numeri con data out null nel t2

lbenaglia Profilo | Guru

>dei 3 esempi sono possibili solo il 1 e il 3 il secondo no, non
>posso trovare due numeri con data out null nel t2
OK, ma nell'1 e nel 3 come ti devi comportare? Applichi la stessa logica oppure no?


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

mortenera Profilo | Junior Member

si se 1 a data not null (anche piu volte) ma e presente 1 con data null non deve apparire trai risultati

lbenaglia Profilo | Guru

>si se 1 a data not null (anche piu volte) ma e presente 1 con
>data null non deve apparire trai risultati

Prova a vedere se questa query fa al caso tuo:

SELECT G.* FROM insgiochi AS G LEFT JOIN ( SELECT n, MIN(IIF(ISNULL(dataout), 0, dataout)) AS MinDataOut FROM installazione GROUP BY n ) AS I ON G.n = I.n WHERE I.n IS NULL OR I.MinDataOut <> #0.00.00#;

La tabella derivata imposta a 0 dataout quando vale NULL e raggruppa per n calcolando il minimo valore di dataout; la outer query esegue una left join tra la tabella insgiochi e la tabella derivata, restituendo tutte le righe non presenti nella tabella derivata e quelle righe dove MinDataOut è diverso da 0.
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mortenera Profilo | Junior Member

grazie taqnto funziona a meraviglia erano 2 gg che ci inpazzivo
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