用于删除使用2列的NOT IN行的SQL查询

时间:2011-09-09 00:55:51

标签: mysql sql

我有一个包含2列复合键的表,比如名称和ID。我有一些服务可以获取要保留的行的键(名称,id组合),其余的我需要删除。如果它只有一行,我可以使用

  

从table_name中删除其中name不在(list_of_valid_names)

但是如何进行查询以便我可以说

name not in (valid_names) and id not in(valid_ids) 
// this wont work since they separately dont identity a unique record or will it?

3 个答案:

答案 0 :(得分:7)

使用mysql的特殊“多值”in语法:

delete from table_name 
where (name, id) not in (select name, id from some_table where some_condition);

如果您的列表是文字列表,您仍然可以使用此方法:

delete from table_name 
where (name, id) not in (select 'john', 1 union select 'sally', 2);

答案 1 :(得分:1)

实际上,我不会撤回我关于需要特殊果汁或被困住的评论(和你所有的选择)。

由于您有要保留的值的列表,请将其转储到临时表中。然后对基表执行删除操作,以获取临时表(左外连接)中不存在的内容。我吮吸mysql语法或者我把你的查询拼凑在一起。 Psuedocode是近似值

DELETE
    B
FROM
    BASE B
    LEFT OUTER JOIN
        #RETAIN R
        ON R.key1 = B.key1
        AND R.key2 = B.key
WHERE
    R.key1 IS NULL

答案 2 :(得分:1)

NOT EXISTS版本:

DELETE
    b
FROM
    BaseTable b
WHERE 
    NOT EXISTS    
        ( SELECT
              *
          FROM 
              RetainTable r
          WHERE
              (r.key1, r.key2) = (b.key1, b.key2)
        )