2009-11-11 17 views
17

Questa è la query che sto usando:Elimina righe da più tabelle utilizzando una singola query (SQL Express 2005), con una condizione WHERE

DELETE TB1.*, TB2.* 
    FROM TB1 
     INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID 
    WHERE (TB1.PersonID)='2' 

Sta funzionando bene in MS Access ma ottenere errore (sintassi errata vicino ','.) in SQL Server Express 2005.

Come risolverlo? Per favore aiuto.

+2

È questo oggi è possibile con SQL Server 2012 o 2014? Ho un set di tabelle orribilmente costruito per il mio progetto di classe che ha i vincoli ON DELETE RESTRICT su entrambe le tabelle contemporaneamente. Non voglio fare un'altra domanda in quanto sarebbe un capriccio di questo. – trysis

risposta

11

Perché non si utilizza uno DELETE CASCADE FK?

17

Non è possibile DELETE da più tabelle con una singola espressione in SQL 2005 - o qualsiasi altro standard SQL per quella materia. Access è l'eccezione qui.

Il metodo migliore per ottenere questo effetto è specificare FOREIGN KEYS tra la tabella con un ONDELETEtrigger.

+0

Questo deve essere il motivo per cui viene visualizzato un errore di sintassi "non corretto sulla virgola che separa le tabelle" DELETE table1, table2 "Sintassi errata vicino a", ". – Rich

3

Questo non può essere fatto in una dichiarazione. Dovrai utilizzare 2 affermazioni

DELETE FROM TB1 WHERE PersonID = '2'; 
DELETE FROM TB2 WHERE PersonID = '2'; 
2

Come so, non è possibile farlo in una frase.

Ma è possibile creare una stored procedure che esegue le eliminazioni desiderate in qualsiasi tabella di una transazione, che è quasi la stessa.

1

Non penso che sia possibile eliminare da più tabelle contemporaneamente (anche se non sono sicuro).

Mi sembra, tuttavia, che sarebbe meglio ottenere questo effetto con una relazione che elimina le cascate. Se lo facessi, potresti eliminare il record da una tabella e i record nell'altro verranno automaticamente eliminati.

Ad esempio, le due tabelle rappresentano un cliente e gli ordini del cliente. Se si imposta la relazione con le eliminazioni a cascata, è possibile semplicemente eliminare il record nella tabella clienti e gli ordini verranno eliminati automaticamente.

Vedere il documento MSDN su cascading referential integrity constraints.

1

Specificare la chiave esterna per le tabelle dei dettagli che fa riferimento alla chiave primaria del master e impostare Elimina regola = Cascata.

Ora, quando si elimina un record dalla tabella principale, tutti gli altri record della tabella dei dettagli basati sul valore della chiave primaria di eliminazione righe verranno eliminati automaticamente.

In tal caso, una singola query di eliminazione della tabella master può eliminare i dati delle tabelle principali nonché i dati delle tabelle figlio.

0

Si può usare qualcosa di simile a quanto segue:

DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name IN ("TB2","TB1") -- use these databases 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name 


WHILE @@FETCH_STATUS = 0 
BEGIN 

     DELETE FROM @name WHERE PersonID ='2' 

     FETCH NEXT FROM db_cursor INTO @name 
END 
-1
DELETE TB1, TB2 
    FROM customer_details 
     LEFT JOIN customer_booking on TB1.cust_id = TB2.fk_cust_id 
    WHERE TB1.cust_id = $id 
+0

Una semplice spiegazione in inglese non guasterebbe. Vedi http://stackoverflow.com/help/how-to-answer – Jubobs

0
CREATE PROCEDURE sp_deleteUserDetails 
    @Email varchar(255) 
AS 
    declare @tempRegId as int 
    Delete UserRegistration where [email protected] 
    set @tempRegId = (select Id from UserRegistration where Email = @Email) 
    Delete UserProfile where [email protected] 

RETURN 0 
0

si può aderire come questo

DELETE t2 
    FROM TB1 t1 
     INNER JOIN TB2 t2 ON t1.PersonID = t2.PersonID 
    WHERE t1.PersonID = '2' 

ma come Alex accennato, solo uno alla volta.

È necessario vincolo a cascata sul tavolo per fare tutto in una volta

-1

Prova questa ricerca

DELETE TB1, TB2 FROM TB1 INNER JOIN TB2 
WHERE TB1.PersonID = TB2.PersonID and TB1.PersonID = '2' 
Problemi correlati