Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结合存在性检查和条件检查的SQL查询_Sql - Fatal编程技术网

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

结合存在性检查和条件检查的SQL查询,sql,Sql,我有两个表,分别称为A和B。A在B上有一个外键。分别称它们为A和B。但设计中未强制执行约束。我不应该改变模式。我需要根据两个条件从表A中删除条目。 1如果表B不包含\u 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

我有两个表,分别称为A和B。A在B上有一个外键。分别称它们为A和B。但设计中未强制执行约束。我不应该改变模式。我需要根据两个条件从表A中删除条目。 1如果表B不包含\u 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)

正如刚才从JustaBitoCode中解释的,请删除以下条件:

(select B_ID from B where status='x')
因为它是冗余的:上一次选择的结果集是以下选择的结果集的子集:

(select B_ID from B)
您可以使用“不存在”来删除表B中没有匹配项的行。此选项将状态=“x”视为未找到匹配项,即它将删除这些行:

delete  A
where   not exists
        (
        select  *
        from    B
        where   B.B_ID = A.A_ID
                and status <> 'x'
        )

JustaBitoCode和UltraCommit告诉我们省略了一部分 此外,如果它是外键,您可以说继续删除定义中不需要的:

这将自动删除每个不匹配的A
这更有效

在您的示例中,A_ID不在从B选择B_ID中,其中status='x'是A_ID的子集不在从B选择B_ID中,这是您想要的吗?JustABitOfCode是正确的!从B中选择B_ID,其中status='x'是从B中选择B_ID的子集,这意味着从B中选择B_ID,其中status='x'是冗余的。我不认为它是子集。虽然看起来是这样。正如我所说,如果b不包含该id,我需要删除1;如果b包含且条件成立,我需要删除2。聪明的建议,恭维!是的,你是对的。但是正如我提到的,我现在不能更改模式。谢谢。看来这就是我需要的。我会试试看。
CREATE TABLE A
(
  uniqeidentifire A_ID
  , FOREIGN KEY (A_ID) REFERENCES B(B_ID) ON DELETE CASCADE
);