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

时间:2011-05-26 11:00:45

标签: 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)

3 个答案:

答案 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)