2010-08-23 9 views
2

Il y a 2 tables: rapport (qui a une clé primaire de reportId et un champ de bits appelé migré) et report_detail (qui a une clé étrangère de reportId). Je veux supprimer toutes les lignes de report_detail qui ont une reportId qui, dans le tableau de rapport, a migré = 1. Ceci est la requête de sélection qui sélectionne toutes les lignes que je veux:J'ai une requête de suppression SQL

select * 
from report r inner join report_detail d 
    on r.reportId = d.reportId 
where migrated = 1 

Est-ce que cette suppression requête ne ce que je veux ou suis-je en train de faire quelque chose de mal?

delete from report_detail 
where exists(
    select * 
    from report r inner join report_detail d 
     on r.reportId = d.reportId 
    where migrated = 1 
) 
+0

S'il vous plaît marquer votre question avec la marque de base de données (s) que vous utilisez, par exemple 'mysql' ou' sql-server'. La réponse peut être différente selon la base de données que vous utilisez. –

Répondre

3
DELETE FROM report_detail 
WHERE 
    report_detail.reportId IN 
    (
     SELECT reportId 
     FROM report 
     WHERE migrated = 1 
    ) 
+0

Vous pouvez également reformuler ceci pour EXISTS: 'WHERE EXISTS (sélectionnez reportID FROM Report où Migrated = 1)' qui peut s'exécuter plus rapidement en fonction du nombre de lignes que vous avez dans vos tables. – JNK

1

MySQL a un moyen de delete d'une table particulière, tout en se joignant à d'autres tables:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

Ou:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 
2

qui supprimera probablement tout dans votre table.

essayer ceci:

delete d 
from report_detail d 
inner join report r 
    on r.reportId = d.reportId 
where migrated = 1 
+0

Cela ne supprimera-t-il pas tout dans les deux tables migrées = 1? Je veux seulement supprimer de la table report_detail. – dmr

+0

J'ai ajouté l'alias pour que la requête fonctionne correctement. Non, il ne supprimera pas des deux tables seulement celle spécifiée pour en supprimer. – HLGEM

2
delete from report_detail d 
inner join report r 
on r.reportId = d.reportId 
where migrated = 1