结合存在性检查和条件检查的SQL查询

问题描述

|| 我有2个表,分别称为A和B。A在B上具有外键。分别将它们称为A_ID和B_ID。但是约束没有在设计中强制执行。我不应该更改架构。我需要根据2个条件从表A中删除条目。 1)如果表B不包含A_ID 2)如果满足B的某些条件。 我已经形成了类似这样的查询。但是我不认为它是最佳的。有更好的方法吗?
delete from A where A_ID not in (select B_ID from B where status=\'x\' ) 
                 or A_ID not in (select B_ID from B)
    

解决方法

您可以使用
not exists
删除表B中没有匹配条目的行。这一行将
status = \'x\'
视为未找到匹配项,即它将删除这些行:
delete  A
where   not exists
        (
        select  *
        from    B
        where   B.B_ID = A.A_ID
                and status <> \'x\'
        )
    ,JustABitOfCode和UltraCommit讲述了省略一部分 此外,如果它是外键,则可以说要删除定义中不需要的A:
CREATE TABLE A
(
  uniqeidentifire A_ID,FOREIGN KEY (A_ID) REFERENCES B(B_ID) ON DELETE CASCADE
);
这将自动删除每个没有B匹配项的A 这更有效     ,如JustABitOfCode所述,请删除条件:
(select B_ID from B where status=\'x\')
因为它是多余的:上一个选择的结果集是以下选择的结果集的子集:
(select B_ID from B)
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...