首页 > 解决方案 > 当我必须测试多个表时如何形成子查询?

问题描述

我必须在我的程序中执行删除,我必须测试数据是否用于其他机器。如果是,则不应删除,如果否,则可以删除。

这是我的一些测试数据表:

机器
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)) 

标签: sqlsqlite

解决方案


您需要在删除查询的 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


推荐阅读