10

在 SQLite 中,我需要更新相关表的行数。

下面的查询可以满足我的要求,但它会多次遍历表格以获取计数:

UPDATE overallCounts SET
  total = (count(*) FROM widgets WHERE joinId=1234),
  totalC = (count(*) FROM widgets WHERE joinId=1234 AND source=0),
  totalL = (count(*) FROM widgets WHERE joinId=1234 AND source=2),
  iic = (SELECT CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END FROM widgets WHERE joinId=1234 AND widgets.source=0),
  il = (SELECT CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END FROM widgets WHERE joinId=1234 AND widgets.source=2)
WHERE id=1234

此查询可以快速准确地检索到我想要的内容,但我需要将其输出转换为更新语句:

SELECT
  count(*) as total,
  sum(case when source=0 then 1 else 0 end) as totalC,
  sum(case when source=2 then 1 else 0 end) as totalL,
  case when source=0 then 1 else 0 end as iic,
  case when source=2 then 1 else 0 end as il
FROM widgets
WHERE joinId=1234
4

4 回答 4

7

SQLite 不支持 UPDATE 查询中的 JOIN。这是 SQLIte 设计的限制。但是,您仍然可以在 SQLite 中使用其强大的 INSERT OR REPLACE 语法来执行此操作。这样做的唯一缺点是您将始终在您的overallCounts 中有一个条目(如果您没有条目,它将被插入)。语法将是:

INSERT OR REPLACE INTO overallCounts (total, totalC, totalL, iic, il)
SELECT
  count(*) as total,
  sum(case when source=0 then 1 else 0 end) as totalC,
  sum(case when source=2 then 1 else 0 end) as totalL,
  case when source=0 then 1 else 0 end as iic,
  case when source=2 then 1 else 0 end as il
FROM widgets
WHERE joinId=1234
ON CONFLICT REPLACE
于 2013-04-18T02:06:42.763 回答
6

在给定的语句中,ItemName 和 ItemCategoryName 在单个语句中使用 UPDATE 进行更新。它在我的 SQLite 中工作。

UPDATE Item SET ItemName='Tea powder', ItemCategoryName='Food' WHERE ItemId='1';
于 2013-07-07T07:44:40.757 回答
6
UPDATE overallCounts SET (total, totalC, totalL, iic, il) =
  (SELECT
    count(*) as total,
    sum(case when source=0 then 1 else 0 end) as totalC,
    sum(case when source=2 then 1 else 0 end) as totalL,
    case when source=0 then 1 else 0 end as iic,
    case when source=2 then 1 else 0 end as il
  FROM widgets
  WHERE joinId=1234)
WHERE joinId=1234;
于 2019-01-23T09:14:47.170 回答
0

@cha 为什么不检查是否存在?

INSERT OR REPLACE INTO overallCounts (total, totalC, totalL, iic, il)
SELECT
  count(*) as total,
  sum(case when source=0 then 1 else 0 end) as totalC,
  sum(case when source=2 then 1 else 0 end) as totalL,
  case when source=0 then 1 else 0 end as iic,
  case when source=2 then 1 else 0 end as il
FROM widgets
WHERE joinId=1234
AND EXISTS (SELECT joinId FROM overallCounts WHERE joinId=1234)
ON CONFLICT REPLACE
于 2016-12-09T00:52:09.530 回答