首页 > 解决方案 > 忽略 SQL delete where exists 语句中的主键

问题描述

今天最后一个基于 CTE 的 SQL 问题,我保证!

我有一个 CTE,它返回几行:

WITH myCte AS
( ... )
SELECT 123 AS PersonId, DeviceId 
FROM myCte

会返回:

 PersonId | DeviceId
 ---------+---------
     123     4
     123     8

我尝试在删除语句中使用结果,这样我就可以摆脱另一个表中的相应行 PersonHasDevice

pk | PersonId | DeviceId
---+----------+---------
1      123        4         - to delete
2      123        5
3      123        8         - to delete
4      991        8

所以我将删除位附加到 CTE 选择中:

WITH myCte AS 
( ... )
DELETE FROM PersonHasDevice 
WHERE EXISTS (SELECT 123 AS PersonId, DeviceId FROM myCte)

但这只是从表中删除所有内容。PersonHasDevice

我不确定是不是因为我没有考虑到桌面上的 PK - 但如果是这样的话,它肯定不应该删除任何东西吗?!

标签: sqlsql-server

解决方案


您需要将 CTE“连接”到您的表。您可以使用exists或使用join

with  myCte as ( ... )
delete phd
    from PersonHasDevice phd join
         myCte
         on phd.PersonId = myCte.PersonId and
            phd.DeviceId = myCte.DeviceId

由 OP 编辑

只是重申123我的原始查询中的硬编码值很容易在这里替换:

with  myCte as ( ... )
delete phd
    from PersonHasDevice phd join
         myCte
         on phd.PersonId = 123 and
            phd.DeviceId = myCte.DeviceId

推荐阅读