我有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)
答案 0 :(得分:3)
您可以使用not exists
删除没有表B中匹配条目的行。这个会将status = 'x'
视为没有找到匹配项,即它会删除这些行:
delete A
where not exists
(
select *
from B
where B.B_ID = A.A_ID
and status <> 'x'
)
答案 1 :(得分:3)
JustABitOfCode和UltraCommit讲述了省略一部分的情况
此外,如果它是外键,您可以说在定义中继续删除不需要的A:
CREATE TABLE A
(
uniqeidentifire A_ID
, FOREIGN KEY (A_ID) REFERENCES B(B_ID) ON DELETE CASCADE
);
这将自动删除没有B匹配的每个A.
这更有效率
答案 2 :(得分:0)
正如刚刚从JustABitOfCode解释的那样,请删除条件:
(select B_ID from B where status='x')
因为它是冗余的:前一个select的结果集是以下select的结果集的SUBSET:
(select B_ID from B)