结合存在性检查和条件检查的SQL查询
我有两个表,分别称为A和B。A在B上有一个外键。分别称它们为A和B。但设计中未强制执行约束。我不应该改变模式。我需要根据两个条件从表A中删除条目。 1如果表B不包含\u ID 2如果满足B上的某些条件 我形成了一个类似这样的疑问。但我不认为它是最佳的。有更好的方法吗结合存在性检查和条件检查的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
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
);