2017-10-16 68 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有一个半连接逻辑运算符,至少可以像常规连接一样有效地完成此操作。 –