我有一个包含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?
答案 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)
)