2011-11-28 12 views
7

Ecco due tabelle:Come eliminare i record in una tabella in base ai valori in un'altra tabella?

tabla1

cm_id cost 
1  6.52 
2  16.52 
3  2.12 
4  7.14 
5  19.09 
6  11.52 
7  0.12 

table2

um_id order_num name 
1  517   tommy 
2  518   bobby 
3  519   scotty 
4  520   faris 
5  521   justine 
6  522   sadie 
7  523   nicole 

cm_id e um_id rappresentano la stessa cosa quindi il costo può essere legato a ciascun numero d'ordine, cioè

SELECT table1.cm_id, table1.cost, table2.order_num, table2.order_num 
FROM table1, table2 
WHERE table1.cm_id=table2.um_id; 

Qual è la singola istruzione SQL che posso utilizzare per eliminare le righe da table1 dove order_num in table2 è compreso tra 518 e 520?

+2

Credo che questo dovrebbe [rispondere alla tua domanda] (http://stackoverflow.com/questions/439750/t-sql-selecting-rows-to-delete-via- si unisce). Basta usare un join. – Ryan

+0

Grazie per il riferimento, ho imparato molto a imparare! – user784637

+0

Duplicati http://stackoverflow.com/questions/1590799/delete-all-rows-in-a-table-based-on-another-table – Igor

risposta

15
delete 
from table1 
where cm_id IN (select um_id from table2 where order_num between 518 and 520) 
+4

non efficiente per un gran numero di dati –

+0

Perché no? Cosa sarebbe efficiente? C'è un altro modo? – bornfromanegg

1

uso DELETE con subquery:

DELETE * FROM table1 WHERE table1.cm_id IN (SELECT table2.um_id FROM table2 WHERE order_num>=518 and order_num<=520) 
+0

ELIMINA DA NON ELIMINA * DA – Cristiana214

7
DELETE table1 
FROM table1 INNER JOIN table2 ON table1.cm_id = table2.um_id 
AND (table2.order_num BETWEEN 518 AND 520) 

--OR 

DELETE 
FROM table1 
USING table1 INNER JOIN table2 ON table1.cm_id = table2.um_id 
WHERE (table2.order_num BETWEEN 518 AND 520) 

EDIT:

C'era un duplicato FROM e query è stata modificata come da Andriy M commenti.

+0

Funzionerebbe in SQL Server. [In MySQL] (http://dev.mysql.com/doc/refman/5.0/en/delete.html "MySQL :: MySQL 5.0 Reference Manual :: 12.2.2 DELETE Syntax") dovresti scegliere * a) * rimuovi il primo 'FROM' o * b) * sostituisci il secondo' FROM' con 'USING'. –

+0

Inoltre, in che modo queste due query differiscono l'una dall'altra? (Voglio dire, a parte il fatto che il secondo contiene meno spazi.) –

+0

Oh, in realtà ho dimenticato di mettere la clausola WHERE alla seconda query, sto cambiando di conseguenza, grazie –

3

preferisco questo modo

delete from table1 
using table1, table2 
where table1.cm_id = table2.um_id 
and table2.order_num >= 518 
and table2.order_num <= 520; 
Problemi correlati