sql - 忽略 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 - 但如果是这样的话,它肯定不应该删除任何东西吗?!
解决方案
您需要将 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
推荐阅读
- android - when selected add border shape for textView and editText ,
- php - 网页是否有 pcntl_exec
- node.js - PM2 日志轮换每周配置
- mariadb - 在 Windows WSL 上将文件导入 MariaDB
- c# - Get column and row of count from GridLayoutGroup programmatically
- python - Python3:与玩家碰撞时从动态数组中删除敌人
- c++ - 在 C++ 中使用开始时间和持续时间计算活动任务
- javascript - Electron ipcRenderer message between two windows doesn't work
- python - ta-lib MACD 函数在封闭的 100 个数字示例上计算错误
- python - 无法理解此 Python 代码的工作原理