我正在使用SQLite 3.11。我创建一个表,如下所示:
CREATE TABLE MyTable (F1 INTEGER, F2 INTEGER);
然后添加以下记录:
INSERT INTO MyTable (F1, F2) Values (1, 2);
INSERT INTO MyTable (F1, F2) Values (1, 3);
INSERT INTO MyTable (F1, F2) Values (2, 4);
INSERT INTO MyTable (F1, F2) Values (2, 5);
INSERT INTO MyTable (F1, F2) Values (3, 6);
INSERT INTO MyTable (F1, F2) Values (3, 7);
INSERT INTO MyTable (F1, F2) Values (4, 2);
现在,如果两个记录具有相同的F1值,那么我将它们定义为冲突记录。
现在,我需要执行以下任务:
对于所有冲突记录,获取不同F1值的总数。在上面的示例中,记录1、2、3、4、5、6是冲突记录,但是不同的值仅为1、2、3,因此总数应为3。
获取冲突记录的总数。在上面的示例中,它应该是6。
将冲突记录的F2值设置为9。保留所有其他记录不变。
怎么做?可以在一个SQL查询中实现任务2和3以提高性能吗?
最佳答案
要搜索冲突,请按F1
进行分组,然后查看具有大于onw行的分组。
不同值的计数就是这些组的数量:
SELECT COUNT(*)
FROM (SELECT F1
FROM MyTable
GROUP BY F1
HAVING COUNT(*) > 1);
(注意:两个
COUNT(*)
计数不同的值。)冲突记录的数量是表中具有这样的
F1
值的行数:SELECT COUNT(*)
FROM MyTable
WHERE F1 IN (SELECT F1
FROM MyTable
GROUP BY F1
HAVING COUNT(*) > 1);
更新它们使用相同的机制:
UPDATE MyTable
SET F2 = 9
WHERE F1 IN (SELECT F1
FROM MyTable
GROUP BY F1
HAVING COUNT(*) > 1);
使用一个查询是不可能的,并且无论如何不会提高性能。
关于sql - 处理重复的字段值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35498415/