我有一个简单的数据库表
create table demo (
id integer PRIMARY KEY,
fv integer,
sv text,
rel_id integer,
FOREIGN KEY (rel_id)
REFERENCES demo(id));
我想删除所有按fv和sv分组的重复行。这已经是一个相当流行的问题,有很好的答案。但我需要改变这种情况。当rel\u id为NULL时,我想保留该行。在任何其他情况下,任何事情都会发生。
所以通过使用以下值
insert into demo (id,fv,sv,rel_id)
VALUES (1,1,'somestring',NULL),
(2,2,'somemorestring',1),
(3,1,'anotherstring',NULL),
(4,2,'somemorestring',3),
(5,1,'somestring',3)
任何一个
id | fv | sv | rel_id
---+----+------------------+-------
1 | 1 | 'somestring' | NULL
2 | 2 | 'somemorestring' | 1
3 | 1 | 'anotherstring' | NULL
或
id | fv | sv | rel_id
---+----+------------------+-------
1 | 1 | 'somestring' | NULL
3 | 1 | 'anotherstring' | NULL
4 | 2 | 'somemorestring' | 3
将是有效的结果。其中为
id | fv | sv | rel_id
---+----+------------------+-------
3 | 1 | 'anotherstring' | NULL
4 | 2 | 'somemorestring' | 3
5 | 1 | 'somestring' | 3
不会。因为第一个条目有NULL
作为rel_id
,它在Not NULL
之上担任主席。
我目前有这个(这是关于基本重复问题的答案)作为删除重复项的查询,但我不确定如何继续修改查询以满足我的需要。
DELETE FROM demo
WHERE id NOT IN (SELECT min(id) as id
FROM demo
GROUP BY fv,sv)
一旦在输入项之前将非空输入项插入数据库,将不会删除一个。可以保证,rel\u id始终指向一个条目,其中rel\u id为NULL,因此没有删除引用条目的危险。此外,保证同一组中不存在rel\u id为NULL的两行。因此,rel\u id为NULL的行对于整个表是唯一的。
或者作为基本算法:
sqlfiddle
我好像已经想通了
DELETE FROM demo
WHERE id NOT IN (SELECT min(id) as id
FROM demo AS out_buff
WHERE rel_id IS NULL OR
NOT EXISTS (SELECT id FROM demo AS in_buff
WHERE rel_id IS NULL AND
in_buff.fv = out_buff.fv AND
in_buff.sv = out_buff.sv)
GROUP BY fv,sv);
通过在内部中选择仅具有值为NULL的
rel\u id的行,或通过使用反条件使具有
rel\u id的行存在为NULL,在
分组上通过参数匹配所有行。但我的查询看起来真的很无效。作为一个简单的假设,运行时间至少为O(n^2)
。
我有这样的promise,1是最新的,3是最老的: 提交1 提交2 提交3 如何删除提交 1 和 2,但保留更改并将其提交到?
问题内容: 我犯了一个错误,并且有多余的重复项。 我有一个包含4个关键字段的表。,,,。 是自动递增和主键。 的组合,而应该是唯一的,我有我之前创建唯一索引来删除重复的行。有些行有一个重复项,有些行有很多重复项。 向我显示了我需要处理的重复值。但是现在我不知道如何保留一个并删除每个重复集的其余部分。 问题答案: 备份数据,然后… MySQL在DELETE语句中支持JOIN。如果要保留第一个重复项:
我试图编写一个代码,它接收并删除该中的重复字符。 例如。如果,则应返回。到目前为止,我的代码只返回与给定的相同的tekst…
问题内容: 对于字符串,我需要它成为。 使用此正则表达式str.replaceAll(“(\ s | \ n)”,“”); 我可以得到“ abc123xyz”,但是如何在两者之间获得空格。 问题答案: 您不必使用正则表达式;您可以使用和代替。 这将为您提供您要查找的字符串。
我有一个表,需要删除整个行,其中ID发生第二次和以后的时间,但留下第一次出现suCustoriID顺便说一下。M表的ID是主键,CustometID是重复的。因此,我需要删除所有重复的自定义ID行。 上面的代码将删除所有id,包括每个id的第一次出现,但我需要保留它们的第一次出现。请告知。
我有一个包含17列(A列到S列)的excel工作表。A列包含ID号,C列是日期列,F列包含时间格式的值(hh: mm)。对于同一个日期/天,一些ID号在F列中包含两个值-通常是一个高数字(多小时和分钟)和一个低数字(几分钟)。如果有这样的重复,我希望从工作表中删除包含F列中低值的整行。 我尝试了Excel的“板载”删除重复项功能,但没有成功。然后我遇到了这段VBA代码,它删除了包含最高值的整个重复