sql - 当我必须测试多个表时如何形成子查询?
问题描述
我必须在我的程序中执行删除,我必须测试数据是否用于其他机器。如果是,则不应删除,如果否,则可以删除。
这是我的一些测试数据表:
机器
ID、名称
1、机器 1
2、机器 2
聚合ID、TypeId
、
MachineId 1、1、1
1、1、2
AggregateTypes
Id、名称
1、打印机
2、烘干机
位置
ID、AggregateTypeId、名称
1、1、POS1
2、1、POS2
3、1、POS3
4、2、POS1 5、2
、POS2
6、2、POS3
第一的:
我在 Aggregate 表中删除了机器和聚合之间的连接
DELETE FROM Aggregate WHERE Machines.Id = 1
二、我删除机器
DELETE FROM Machines WHERE Machines.Id = 1
到目前为止它工作正常,但现在我必须删除所有现在没有连接机器的 AggregateTypes。在我可以删除 AggregateTypes 之前,我必须删除 AggregateTypeId = AggregateTypes.Id 的所有位置。
为此,我编写了以下 SQL:
DELETE FROM Location WHERE Location.AggregateTypeId =
(SELECT AggregateTypes.Id FROM AggregateTypes, Aggregate WHERE NOT EXISTS
(SELECT AggregateTypes.Id FROM Aggregate, AggregateTypes WHERE AggregateTypes.Id = Aggregate.TypeId));
它甚至没有删除一行,我不知道为什么。我是 SQL 新手,想了解我做错了什么以及应该如何解决这样的问题。
感谢dd619的回答。
对于在这里遇到同样问题的每个人来说,我的最终 SQL 都有效:
DELETE FROM Location WHERE Location.AggregateTypeId IN
(SELECT AggregateTypes.Id FROM AggregateTypes WHERE NOT EXISTS
(SELECT Aggregate.Id FROM Aggregate WHERE Aggregate.TypeId = AggregateTypes.Id))
解决方案
您需要在删除查询的 where 子句中使用in运算符。
所以查询将如下所示:
DELETE FROM Location WHERE Location.AggregateTypeId IN
(SELECT AggregateTypes.Id FROM AggregateTypes, Aggregate WHERE NOT EXISTS
(SELECT AggregateTypes.Id FROM Aggregate, AggregateTypes WHERE AggregateTypes.Id = Aggregate.TypeId));
where 子句中的选择查询可能返回多条记录,因此条件失败。使用运算符是检查返回结果中是否存在in
您的正确方法。AggregateTypeId
推荐阅读
- spyder - Python蜘蛛终端
- postgresql - libpqxx C 聚合扩展返回错误数据?
- postgresql - 如何求和每一行的总数?
- mirror - 用一个更大的磁盘替换 ZFS 池中的两个磁盘镜像
- swift - 为什么 reversed() 的结果确实表现得像一个数组?
- twilio - 要求 Twilio 在 webhook 中传递自定义标头
- python - 取消按钮表单无法正常工作
- java - Tomcat 服务器网络应用程序
- docker - 无法在 Compose 中使用现有网络:错误:网络声明为外部,但找不到
- haskell - 我的“记忆”帕斯卡函数并没有真正起作用