2017-10-16 106 views
0

我嘗試使用下面的查詢,刪除,但遺憾的是,所有的記錄都被刪除刪除使用子查詢和相交?

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

    INTERSECT 

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

如何正確使用子查詢從源表中刪除相應的記錄?

這兩個表格中沒有任何鍵或約束。

回答

1

試試這個

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

我可以試試這個,但我需要檢查綁定列表中的多個列 – coffemug

+0

您可以像這樣添加連接子句「and [dbo]。[devicelinks] .MyField = ASC.dbo.DEVICE_LINK.MyField」You cha有儘可能多的這些所需 – RegBes

+0

這是推薦的,子查詢或加入 – coffemug

2

您可以使用EXISTS檢測記錄被刪除:

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

完美。 ........ – coffemug

+0

在大型數據集上,您可能會遇到EXISTS和嵌套連接的性能問題。 – RegBes

+1

@RegBes - 對於較大的數據集,您可能會遇到任何查詢的性能問題。 「EXISTS」本質上並不比你認爲你試圖暗示的答案差。 SQL Server有一個半連接邏輯運算符,至少可以像常規連接一樣有效地完成此操作。 –