Eliminare record non correlati

lunedì 26 luglio 2010 - 17.57
Tag Elenco Tags  VB.NET  |  Visual Studio Express  |  SQL Server 2008

alexmed Profilo | Guru

Ciao a tutti,
Mi sono accorto solo ora (dopo circa 4 mesi) di non aver collegato due tabelle (su un database SQL su aruba) ed ora mi ritrovo diversi record (fotografie, tabella B) che non sono collegati con la tabella principale (A).

Mi stò inventato una procedura tramite Visual Basic per eliminare questi record:
1. faccio una SELECT DISTINCT nella tabella A
2. per ogni ID trovato copio i dati in una tabella temporanea
3. elimino tutti i record dalla tabella B
4. copio i dati dalla tabella temporanea alla tabella B

Non è che c'è una procedura SQL più rapida?

Ciao

alexmed

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>Mi sono accorto solo ora (dopo circa 4 mesi) di non aver collegato
>due tabelle (su un database SQL su aruba) ed ora mi ritrovo diversi
>record (fotografie, tabella B) che non sono collegati con la
>tabella principale (A).
eh sì.. le foreign key servono

>1. faccio una SELECT DISTINCT nella tabella A
>2. per ogni ID trovato copio i dati in una tabella temporanea
>3. elimino tutti i record dalla tabella B
>4. copio i dati dalla tabella temporanea alla tabella B
>Non è che c'è una procedura SQL più rapida?
Se devi solo cancellare i record "orfani" puoi utilizzare una semplice left join.
Dei record "slegati" devi fare qualcosa? Devi fare un backup di sicurezza?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alexmed Profilo | Guru


Ciao

>eh sì.. le foreign key servono
Ho voluto toccare con mano

>Se devi solo cancellare i record "orfani" puoi utilizzare una
>semplice left join.
>Dei record "slegati" devi fare qualcosa? Devi fare un backup
>di sicurezza?
Diciamo che se utilizzassi la mia "formula magica" allora farei prima un backup altrimenti no perchè in ogni caso avrei le foto originali in locale
Puoi mica indicarmi o instradarmi su come impostare questa left join?

Grazie

alexmed

alx_81 Profilo | Guru

>Puoi mica indicarmi o instradarmi su come impostare questa left join?
osserva questo esempio:

USE tempdb; GO -- creo le tabelle di prova -- master CREATE TABLE dbo.Headers ( IDHeader int NOT NULL , HeaderDate smalldatetime NOT NULL , CONSTRAINT PK_dboHeaders PRIMARY KEY CLUSTERED ( IDHeader ) ) GO -- detail CREATE TABLE dbo.Details ( IDHeader int NOT NULL , IDDetail int NOT NULL , DetailName varchar(20) NOT NULL , CONSTRAINT PK_dboDetails PRIMARY KEY CLUSTERED ( IDHeader , IDDetail ) ) GO -- backup CREATE TABLE dbo.tempDeleted ( IDHeader int NOT NULL , IDDetail int NOT NULL , DetailName varchar(20) NOT NULL , CONSTRAINT PK_dbotempDeleted PRIMARY KEY CLUSTERED ( IDHeader , IDDetail ) ) GO -- inserisco il master INSERT INTO dbo.Headers (IDHeader, HeaderDate) VALUES (1, '20100726 18:00') INSERT INTO dbo.Headers (IDHeader, HeaderDate) VALUES (2, '20100726 19:00') INSERT INTO dbo.Headers (IDHeader, HeaderDate) VALUES (3, '20100726 20:00') -- manca il 4 INSERT INTO dbo.Headers (IDHeader, HeaderDate) VALUES (5, '20100726 21:00') GO -- inserisco i dettagli "legati" INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (1, 1, 'UNO_UNO') INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (1, 2, 'UNO_DUE') INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (2, 1, 'DUE_UNO') INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (2, 2, 'DUE_DUE') INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (3, 1, 'TRE_UNO') INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (5, 1, 'CINQUE_UNO') GO -- inserisco i dettagli "slegati" (orfani) INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (4, 1, 'QUATTRO_UNO') INSERT INTO dbo.Details (IDHeader, IDDetail, DetailName) VALUES (4, 2, 'QUATTRO_DUE') GO -- contenuto SELECT * FROM dbo.Headers /* IDHeader HeaderDate ----------- ----------------------- 1 2010-07-26 18:00:00 2 2010-07-26 19:00:00 3 2010-07-26 20:00:00 5 2010-07-26 21:00:00 */ SELECT * FROM dbo.Details /* IDHeader IDDetail DetailName ----------- ----------- -------------------- 1 1 UNO_UNO 1 2 UNO_DUE 2 1 DUE_UNO 2 2 DUE_DUE 3 1 TRE_UNO 4 1 QUATTRO_UNO 4 2 QUATTRO_DUE 5 1 CINQUE_UNO */ -- cancello gli orfani e li metto in una tabella creata al volo per il backup DELETE D OUTPUT DELETED.* INTO dbo.tempDeleted FROM dbo.Details D LEFT JOIN dbo.Headers H ON H.IDHeader = D.IDHeader WHERE H.IDHeader IS NULL GO -- questo è il backup SELECT * FROM dbo.tempDeleted /* IDHeader IDDetail DetailName ----------- ----------- -------------------- 4 1 QUATTRO_UNO 4 2 QUATTRO_DUE */ -- clean up DROP TABLE dbo.Headers GO DROP TABLE dbo.Details GO DROP TABLE dbo.tempDeleted GO

>Grazie
di nulla!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alexmed Profilo | Guru

Ok, grazie mille
adesso mi metto subito all'opera e ti faccio sapere.

Ciao
alexmed

alexmed Profilo | Guru


Bene!!!! Sembra essere andato tutto a buon fine.
Ti ringrazio per la collaborazione e la disponibilità.

Ciao

alexmed
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