2017-10-16 5 views
0

J'essaie de supprimer à l'aide de la requête ci-dessous mais malheureusement, tous les enregistrements sont supprimésSupprimer à l'aide de la sous-requête et se croiser?

DELETE [dbo].[devicelinks] 
FROM 
    (SELECT * 
    FROM [dbo].[devicelinks] 
    WHERE PID = 7 

    INTERSECT 

    SELECT * 
    FROM ASC.dbo.DEVICE_LINK 
    WHERE PID = 7) 

Comment utiliser correctement la sous-requête pour supprimer les enregistrements correspondants de la table source?

Aucune clé ou contrainte dans l'une des deux tables.

Répondre

1

pour cette solution

delete [dbo].[devicelinks] 
from [dbo].[devicelinks] 
    inner join ASC.dbo.DEVICE_LINK 
    on [dbo].[devicelinks].PID = ASC.dbo.DEVICE_LINK.PID 
where [dbo].[devicelinks].PID = 7 
+0

je peux essayer cela mais j'ai besoin de vérifier plus d'une colonne dans ma liste de liaison – coffemug

+0

Vous pouvez ajouter sur la la clause de jointure comme ceci "et [dbo]. [Devicelinks] .MyField = ASC.dbo.DEVICE_LINK.MyField" Vous J'ai le nombre de ceux requis – RegBes

+0

Ce qui est recommandé, sous-requête ou rejoindre – coffemug

2

Vous pouvez utiliser EXISTS pour détecter les enregistrements à supprimer:

DELETE d1 
FROM [dbo].[devicelinks] d1 
WHERE PID = 7 AND EXISTS (SELECT * 
          FROM ASC.dbo.DEVICE_LINK AS d2 
          WHERE d1.PID = d2.PID AND 
           d1.[DEVICEID] = d2.[DEVICEID] AND 
           ... rest of the fields here) 
+0

parfait. ........ – coffemug

+0

vous pouvez obtenir des problèmes de performances avec une jointure EXISTS et imbriquée sur des jeux de données plus volumineux. – RegBes

+1

@RegBes - Vous pouvez rencontrer des problèmes de performance avec n'importe quelle requête sur des jeux de données plus volumineux. 'EXISTS' n'est pas intrinsèquement pire que votre réponse que je suppose que vous essayez d'impliquer. SQL Server dispose d'un opérateur logique semi-jointure qui peut le faire au moins aussi efficacement qu'une jointure régulière. –