Eliminare i dati inversi ad una selezione in ACCESS

venerdì 17 ottobre 2008 - 16.25

jampicoll Profilo | Junior Member

Vi prego di aiutarmi anche questa volta...
Data una tabella di dati ho realizzato una query che mi seleziona alcuni dati in base ad una selezione.
Adesso vorrei fare in modo di eliminare i dati non presenti in questa selezione, cioè gli esclusi.

Aspetto il vostro aiuto.

Brainkiller Profilo | Guru

>Vi prego di aiutarmi anche questa volta...
>Data una tabella di dati ho realizzato una query che mi seleziona
>alcuni dati in base ad una selezione.
>Adesso vorrei fare in modo di eliminare i dati non presenti in
>questa selezione, cioè gli esclusi.

Beh è sufficiente negare le condizioni del filtro per andare a eliminare tutti gli altri.
Cioè se il filtro è Where CustomerID=1 per eliminare gli altri record è sufficiente cambiare uguale con diverso e mettere Where Customer<>1
Se sono più condizioni bisogna negarle tutte.

Oppure puoi usare una subquery. Tu hai detto che hai creato una Query di selezione.... puoi fare così.

DELETE From TABELLA_ORIGINALE WHERE RecordID NOT IN (SELECT RecordID FROM QUERY_TUA)

RecordID è l'ID chiave primaria.
Query_Tua è la query che hai creato per selezionare certi dati.
Tabella_Originale è la tabella che contiene tutto.

Ciao

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

sanbiz Profilo | Senior Member

>Data una tabella di dati ho realizzato una query che mi seleziona
>alcuni dati in base ad una selezione.
>Adesso vorrei fare in modo di eliminare i dati non presenti in
>questa selezione, cioè gli esclusi.

Dipende da come come stai lavorando.
Sarebbe molto utile che tu fornissi anche qualche riga d'esempio con le istruzioni che stai utilizzando.

In ogni caso, facciamo un esempio: se hai fatto una select con una Where, basta che inverti la tua selezione.
Facciamo un esempio:

set nocount on
use tempdb

--Creo la mia tabella di prova
create table Table1 (
id_cliente int,
data_ordine smalldatetime,
numero_ordine int
)

-- Inserisco i valori nella tabella
insert into Table1 values(1,'20060520', 110)
insert into Table1 values(1,'20060526', 120)
insert into Table1 values(1,'20060601', 130)
insert into Table1 values(1,'20060701', 140)
insert into Table1 values(1,'20060721', 150)
insert into Table1 values(2,'20060509', 210)
insert into Table1 values(2,'20060620', 220)
insert into Table1 values(2,'20060801', 230)
insert into Table1 values(3,'20051231', 310)
insert into Table1 values(3,'20060115', 330)
insert into Table1 values(3,'20060328', 340)
insert into Table1 values(3,'20060329', 350)

/* Faccio una select per recuperarne alcuni*/
select *
from Table1
where numero_ordine in (110,210,310)

/*Output
id_cliente data_ordine numero_ordine
----------- ----------------------- -------------
1 2006-05-20 00:00:00 110
2 2006-05-09 00:00:00 210
3 2005-12-31 00:00:00 310
*/

/*Se voglio selezionare tutti gli altri sarà:*/

Select *
from Table1
where numero_ordine not in (110,210,310)

/*Se voglio eliminare tutti gli altri sarà:*/
Delete Table1
where numero_ordine not in (110,210,310)

Se, invece, ho un'altra tabella per il confronto:

--Creo la seconda tabella
create table Table2 (
id_cliente int,
data_ordine smalldatetime,
numero_ordine int
)

-- Inserisco i valori nella seconda tabella
insert into Table2 values(1,'20060520', 110)
insert into Table2 values(2,'20060509', 210)
insert into Table2 values(3,'20051231', 310)

/* Ora li elimino*/
delete Table1 where numero_Ordine in(
select
T1.Numero_Ordine
from table1 T1
left join Table2 T2 on T1.Numero_Ordine = T2.Numero_Ordine
where T2.numero_ordine is null
)



--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

jampicoll Profilo | Junior Member

in pratica dovrei eliminare tutte le righe che hanno lo stesso numero di telefono.
Il database ha 220.000 righe
ho preparato questo codice per una query:

DELETE *
FROM ANAGRAFICHE
WHERE ANAGRAFICHE.[ANAGRAFICA TELEFONO] NOT IN
(
SELECT DISTINCT ANAGRAFICHE.[ANAGRAFICA TELEFONO]
FROM ANAGRAFICHE
);

Il problema è che è come se si bloccasse. Non capisco se lavora o va avanti. Capisco che sono parecchie righe ma....

C'è un codice che possa fare lo stesso risultato con un minore lavoro?

lbenaglia Profilo | Guru

>SELECT DISTINCT ANAGRAFICHE.[ANAGRAFICA ID], ANAGRAFICHE.[ANAGRAFICA
>TELEFONO]
>FROM ANAGRAFICHE
>GROUP BY ANAGRAFICHE.[ANAGRAFICA ID], ANAGRAFICHE.[ANAGRAFICA
>TELEFONO]
>);
>
>QUESTO è IL CODICE CHE MI RESTITUISCE LA SELEZIONE.
>ADESSO VORREI ELIMINARE TUTTO QUANTO ESCLUSO DA QUESTO.

Iniziamo a dire che l'utilizzo contemporaneo di DISTINCT e GROUP BY è ridondante, dato che DISTINCT esegue un raggruppamento su tutte le colonne della select list.
Ora, supponendo che ANAGRAFICA ID sia la Primary Key della tabella il raggruppamento è del tutto inutile data l'univocità della colonna.
Inoltre non vedo alcuna clausola WHERE, quindi verranno estratte tutte le righe della tabella, quindi non ti rimane alcuna riga da eliminare

Quanto scritto sopra è frutto di deduzioni logiche basate sull'unica informazione che ci hai fornito, ovvero il comando di SELECT.
Se desideri ricevere un aiuto concreto posta un esempio completo con i comandi SQL di creazione della tabella, alcune righe di prova ed il result set finale che vorresti ottenere. Nel caso stia lavorando con Access, allega il file mdb compresso in formato zip ad un nuovo post.

Ciao!

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

lbenaglia Profilo | Guru

>in pratica dovrei eliminare tutte le righe che hanno lo stesso
>numero di telefono.
>Il database ha 220.000 righe
>ho preparato questo codice per una query:
>
>DELETE *
>FROM ANAGRAFICHE
>WHERE ANAGRAFICHE.[ANAGRAFICA TELEFONO] NOT IN
>(
>SELECT DISTINCT ANAGRAFICHE.[ANAGRAFICA TELEFONO]
>FROM ANAGRAFICHE
>);

Questo comando NON elimina alcuna riga dato che la subquery restituisce TUTTI i numeri di telefono.

P.S.: non continuare ad editare gli stessi post altrimenti si perde il filo del discorso.
Se hai nuove domande crea un nuovo post.

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

jampicoll Profilo | Junior Member

io pensavo che la select restituisse tutti i numeri di telefono e che poi con il delete NOT IN riuscissi ad eliminare le restanti...

Come posso fare allora?

lbenaglia Profilo | Guru

>io pensavo che la select restituisse tutti i numeri di telefono
>e che poi con il delete NOT IN riuscissi ad eliminare le restanti...
Scusa, analizza quello che hai scritto.
La SELECT restituisce tutti i numeri di telefono, quindi quali sarebbero i restanti? I restanti di TUTTI è un insieme vuoto

>Come posso fare allora?
Spiegaci con un esempio completo quello che devi fare.

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

jampicoll Profilo | Junior Member

allora come faccio ad eliminare i doppioni???
Ci sono delle righe che contengono dei numeri di telefono ma volte le righe sono duplicate riferite al numero di telefono e vorrei eliminare le righe che contengono lo stesso numero.

lbenaglia Profilo | Guru

>allora come faccio ad eliminare i doppioni???
Posta un esempio basato sulla tua tabella, altrimenti non possiamo aiutarti.

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

jampicoll Profilo | Junior Member

ID-------NOME--------TELEFONO--------INDIRIZZO

1--------MARIO-------333333333--------VIA ROMA 60
2--------LUCA--------333333333---------VIA ROMA 60
3--------MARIO------444444444---------VIA GENOVA 11
4--------GINO--------333333333--------VIA INDIPENDENZA 2

VORREI FARE IN MODO DI CANCELLARE LE RIGHE CHE HANNO LO STESSO NUMERO DI TELEFONO.
SPERO DI ESSERE STATO CHIARO

lbenaglia Profilo | Guru

>ID-------NOME--------TELEFONO--------INDIRIZZO
>
>1--------MARIO-------333333333--------VIA ROMA 60
>2--------LUCA--------333333333---------VIA ROMA 60
>3--------MARIO------444444444---------VIA GENOVA 11
>4--------GINO--------333333333--------VIA INDIPENDENZA 2
>
>VORREI FARE IN MODO DI CANCELLARE LE RIGHE CHE HANNO LO STESSO
>NUMERO DI TELEFONO.
Tra le righe con il telefono duplicato quale vorresti mantenere?
La 1, la 2 o la 4? Con che logica l'hai scelta?

Ciao!

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

jampicoll Profilo | Junior Member

La logica è di non avere numeri duplicati.
E' un database di un call-center quindi a prescindere dall'utente.
Conta non avere numeri uguali.

lbenaglia Profilo | Guru

>La logica è di non avere numeri duplicati.
>E' un database di un call-center quindi a prescindere dall'utente.
>Conta non avere numeri uguali.

OK, allora decido io
Nel caso in cui avrò numeri di telefono uguali considererò la prima occorrenza:

DELETE FROM Anagrafiche WHERE ID NOT IN ( SELECT MIN(ID) FROM Anagrafiche GROUP BY Telefono );

La sottoquery recupera il più piccolo ID a parità di telefono, mentre la DELETE provvederà ad eliminare tutte le alre righe.
In base ai dati che hai postato dopo l'esecuzione della mia query otterrai:

ID Nome Telefono Indirizzo --- ------ ---------- -------------- 1 Mario 333333333 Via Roma 60 3 Mario 444444444 Via Genova 11

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

jampicoll Profilo | Junior Member

HO MESSO IN ESECUZIONE LA QUERY DA 20 MINUTI E SEMBRA CHE NON VADA AVANTI.
CHE DEVO FARE???
SONO 220.000 RIGHE PERO...
CREDI CHE DEVO AVERE PAZIENZA?

lbenaglia Profilo | Guru

>HO MESSO IN ESECUZIONE LA QUERY DA 20 MINUTI E SEMBRA CHE NON
>VADA AVANTI.
>CHE DEVO FARE???
Stappare una bottiglia di Barolo e sorseggiarne un bel calice

>SONO 220.000 RIGHE PERO...
>CREDI CHE DEVO AVERE PAZIENZA?
Se non hai definito alcun indice è normale che l'esecuzione sia "un po'" lenta

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

jampicoll Profilo | Junior Member

Che cosa significa non aver definito un indice???

lbenaglia Profilo | Guru

>Che cosa significa non aver definito un indice???
http://office.microsoft.com/it-it/access/HA102103471040.aspx

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5