如何在sqlite3的另一列中创建ID计数列

时间:2018-09-07 23:02:07

标签: sql sqlite

我有一个表“ auto_ID”,其中有四列,即“ unique_id”,“ car_id”,“ car_name”和“ car_count”。我希望“ car_count”包括“ car_id”的给定值出现在列“ car_id”中的次数的计数,如下所示。请注意,我不是要进行简单的分组,而是要将相关计数添加到“ car_count”列中。我如何在sqlite3中做到这一点?

unique_id   car_id   car_name   car_count
1234        1111     Camry      2
2345        2222     Prius      3
3456        1111     Camry      2
4567        2222     Prius      3
5678        3333     Corolla    1
6789        2222     Prius      3

我尝试使用以下命令,但未获得期望的结果:

UPDATE auto_ID
SET car_count = (SELECT COUNT(DISTINCT car_id) from auto_ID;

2 个答案:

答案 0 :(得分:1)

由于sqlite不支持UPDATE ... FROM

您可以尝试编写子查询,然后先group by car_id计数,再UPDATE

模式(SQLite v3.18)

CREATE TABLE auto_ID(
   unique_id INT,
   car_id INT,
   car_name VARCHAR(50),
   car_count INT
);


INSERT INTO auto_ID VALUES (1234,1111,'Camry',NULL);
INSERT INTO auto_ID VALUES (2345,2222,'Prius',NULL);
INSERT INTO auto_ID VALUES (3456,1111,'Camry',NULL);
INSERT INTO auto_ID VALUES (4567,2222,'Prius',NULL);
INSERT INTO auto_ID VALUES (5678,3333,'Corolla',NULL);
INSERT INTO auto_ID VALUES (6789,2222,'Prius',NULL);



UPDATE  auto_ID
SET car_count = (
  SELECT t1.cnt FROM(
     SELECT COUNT(*) cnt,t1.car_id id  
     from auto_ID t1
     GROUP BY t1.car_id
  ) t1
  where car_id = t1.id
)

查询#1

SELECT * from auto_ID;

| unique_id | car_id | car_name | car_count |
| --------- | ------ | -------- | --------- |
| 1234      | 1111   | Camry    | 2         |
| 2345      | 2222   | Prius    | 3         |
| 3456      | 1111   | Camry    | 2         |
| 4567      | 2222   | Prius    | 3         |
| 5678      | 3333   | Corolla  | 1         |
| 6789      | 2222   | Prius    | 3         |

View on DB Fiddle

答案 1 :(得分:0)

子查询SELECT COUNT(DISTINCT car_id) from auto_ID返回什么?对于此数据,它返回3。始终为3。(当然,假设语法正确)。

子查询中需要一个WHERE子句。您要基于car_count更新car_id。您想为每个car_id命名为cid吗?您需要SELECT count(*) from auto_id where car_id = cid。子查询需要一个WHERE子句。由于它是自引用的,因此在子查询中将需要表名称的别名。

类似的方法会起作用,但是如果您想自己弄清楚,请不要看

  

   UPDATE auto_ID
   SET car_count = (SELECT COUNT(*)
   from auto_ID a2
   where a2.car_id = auto_ID.car_id) ;