问题描述
||
我有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)