处理重复的字段值

时间:2016-02-19 06:07:06

标签: sql sqlite duplicates

我正在使用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值,那么我将它们定义为冲突记录。

现在我需要执行以下任务:

  1. 对于所有冲突记录,获取不同F1值的总数。在上面的示例中,记录1,2,3,4,5,6是冲突记录,但不同的值仅为1,2,3,因此总计数应为3.
  2. 获取冲突记录的总数。在上面的例子中,它应该是6。
  3. 将冲突记录的F2值设置为9.保持所有其他记录不变。
  4. 怎么做?可以在一个SQL查询中实现任务2和3以提高性能吗?

1 个答案:

答案 0 :(得分:2)

要搜索冲突,请按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);

无法使用一个查询,也无法提高性能。