SQLite - 从 myTable 插入到 myTable 中选择计数 (*) 其中 Date = 'mydate' 语法错误

Posted

技术标签:

【中文标题】SQLite - 从 myTable 插入到 myTable 中选择计数 (*) 其中 Date = \'mydate\' 语法错误【英文标题】:SQLite - Insert Into myTable Select Count (*) From myTable Where Date = 'mydate' Syntax ErrorSQLite - 从 myTable 插入到 myTable 中选择计数 (*) 其中 Date = 'mydate' 语法错误 【发布时间】:2016-01-03 22:33:17 【问题描述】:

我正在尝试计算日期 = 另一个表中的日期的表的行数。我想将此查询的结果插入到另一个表的行中,其中日期等于用于计算要计算的相关行的日期。

我发现这个帖子很有帮助: Select Count(*) function works

但是,当我将计数插入到带有表标签的列时,没有发生插入也没有错误。

我的实际代码:

INSERT INTO "main"."LookUpWrkflwTemp" (SpiralUniverse)
   SELECT Count (*)
   FROM SpiralUniverse 
   WHERE Date = '2015-11-16';

在 LookUpWrkflwTemp 中有一个名为 SpiralUniverse 的表和一个名为 SpiralUniverse 的列。

我的最终目标是向 LookUpWrkflwTemp(Date) 添加日期,然后在各种表中执行与该日期匹配的记录计数,并将这些值插入以这些表命名的适当列中。上面的代码 sn -p 是插入一列,日期是硬编码的。

例如。 LookUpWrkflwTemp(Date,ImportDailyList,SpiralUniverse,...) 是我想在匹配的 Date 行中插入记录计数值的表和列。 ImportDailyList 和 SpiralUniverse 是我要搜索日期匹配记录计数的不同表。

我在上面的代码 sn-p 的语法中遗漏了什么?

编辑:

Sample data for LookUpWrkflwTemp(Date,ImportDailyList,SpiralUniverse,...)
rowid   Date        ImportDailyList   SpiralUniverse
1     2015-11-15        null               1
2     2015-11-16        null               4    <---record count and insert                           into this table that I´m looking for



Sample data for SpiralUniverse
rowid   Date         Symbol
1     2015-11-16     ACOR
2     2015-11-16     COR
3     2015-11-16     AAPL
4     2015-11-16     TSLA
5     2015-11-15     TSLA
...

即使 Select Count(*) 函数正常工作,sqlite 也不会生成语法错误,也不会正确插入记录计数。我怀疑问题出在 INSERT INTO 或 WHERE 子句中。

【问题讨论】:

所以,您想在临时表中插入一行,其中计数列来自另一个表,对吗?就这些? 没有。该表是一个持久表,计数列来自另一个表,其中日期与持久表中的日期匹配。 您能否为LookUpWrkflwTempSpiralUniverse 以及任何其他涉及的表添加示例数据,并包括您希望获得的结果? 另外,您能在此处插入确切的 sql 错误吗?因为在这种情况下,这段代码需要工作,我将表和行的名称更改为我的,它工作了...... @zedfoxus,感谢您澄清我的问题。 【参考方案1】:

如果您想在该表中插入一条新记录:

INSERT INTO "main"."LookUpWrkflwTemp" (Date, SpiralUniverse) VALUES('2015-11-16', (
   SELECT Count (*)
   FROM SpiralUniverse 
   WHERE Date = '2015-11-16');

INSERT INTO "main"."LookUpWrkflwTemp" (Date, SpiralUniverse)
   SELECT '2015-11-16', Count (*)
   FROM SpiralUniverse 
   WHERE Date = '2015-11-16';

在这种情况下,仅当您的 rowid 为自动增量且其他列具有默认值或可以为 NULL 时。

如果您有该日期到 LookUpWrkflwTemp 表中,您也可以插入一个新行,但在这种情况下,您将有两行具有相同的日期。你也可以UPDATE你的行。

UPDATE "LookUpWrkflwTemp" SET SpiralUniverse = (
  SELECT Count (*)
  FROM SpiralUniverse 
  WHERE Date = '2015-11-16') WHERE Date = '2015-11-16'; -- or by rowid = x where x is the correct rows rowid

您还可以在插入时从不同的表中获得多个计数:

INSERT INTO "main"."LookUpWrkflwTemp" (Date, ImportDailyList, SpiralUniverse) VALUES('2015-11-16', (
   SELECT Count (*)
   FROM ImportDailyList 
   WHERE Date = '2015-11-16'), (
   SELECT Count (*)
   FROM SpiralUniverse 
   WHERE Date = '2015-11-16');

"main". 不是必需的,仅当您想引用另一个数据库时。

以我的数据库为例: 标签(ID、姓名、日期) 文件(id,收藏夹,添加,...) 这两种情况的 ID 都是 PrimaryKey 并且是自增的。

文件数据:

id  favorite    date
1       0       2015-11-30 23:25:44
2       1       2015-11-30 23:25:44
3       1       2015-11-30 23:25:44
4       0       2015-11-30 23:25:44
5       0       2015-11-30 23:40:17

标签表为空

在这种情况下:

Query executed successfully:
INSERT INTO "tags" (name) 
  SELECT count (*) FROM files
  WHERE added = '2015-11-30 23:25:44' (took 0ms)

Tags table:
id  name    date
1   4       NULL

Query executed successfully: 
INSERT INTO "tags" (name, date) 
  SELECT count (*), '2015-11-30 23:25:44' FROM files
  WHERE added = '2015-11-30 23:25:44' (took 0ms)

Tags table:
id  name    date
1   4       NULL
2   4       2015-11-30 23:25:44

Query executed successfully: 
INSERT INTO "tags" (name, date) 
  SELECT count (*), '2015-11-30 23:25:44' FROM files
  GROUP BY favorite (took 0ms)


Tags table:
id  name    date
1   4       NULL
2   4       2015-11-30 23:25:44
3   3       2015-11-30 23:25:44
4   2       2015-11-30 23:25:44

Query executed successfully: 
INSERT INTO "tags" (name, date) 
  SELECT count (*), added FROM files GROUP BY favorite, added (took 0ms)

Tags table:
id  name    date
1   4       NULL
2   4       2015-11-30 23:25:44
3   3       2015-11-30 23:25:44
4   2       2015-11-30 23:25:44
5   2       2015-11-30 23:25:44
6   1       2015-11-30 23:40:17
7   2       2015-11-30 23:25:44

最后一个更新:

Query executed successfully: 
UPDATE tags SET name = (
  SELECT count (*) FROM files WHERE added = '2015-11-30 23:25:44') 
WHERE date = '2015-11-30 23:25:44' (took 0ms)

Tags table:
id  name    date
1   4       NULL
2   4       2015-11-30 23:25:44
3   4       2015-11-30 23:25:44
4   4       2015-11-30 23:25:44
5   4       2015-11-30 23:25:44
6   1       2015-11-30 23:40:17
7   4       2015-11-30 23:25:44

现在我清空了 tags 表并从 id 列中删除了 primarykey 和 autoincrement 值,该列也具有 NOT NULL 属性: 然后我尝试运行它:

INSERT INTO "tags" (name) 
  SELECT count (*) FROM files
  WHERE added = '2015-11-30 23:25:44'

我明白了:

NOT NULL constraint failed: tags.id: INSERT INTO "tags" (name) 
  SELECT count (*) FROM files
  WHERE added = '2015-11-30 23:25:44'

也可以试试 SqliteBrowser (http://sqlitebrowser.org/),它很有用,你可以打开 sqlite DB 并运行代码。我用这个应用程序尝试了这些代码,它也显示了 sqlite 异常。

【讨论】:

感谢您的深入回复。最后一部分是在查询中传递日期值,而不是对日期进行硬编码。 “如果您在 LookUpWrkflwTemp 表中有该日期,您也可以插入一个新行,但在这种情况下,您将有两行具有相同的日期。您也可以更新您的行。”谢谢你的远见。在你的这个例子中,如果我想搜索一个日期以传递到这个查询中存储为 LookUpWrkflwTemp 中的值,那么 WHERE 子句中的语法是什么?也就是说只包含一个新日期的行,其他的值都是空的。 我正在为 Firefox 使用 SqliteBrowser。它不会像我以前看到的那样给出错误。我相信您所说的是正确的,但是在我的情况下,没有错误也没有插入(使用我的代码)。 在我的示例中,计数列是标签中的名称,所以我需要这样做: WHERE name IS NULL 也,如果您对多个列感兴趣: WHERE column1 IS NULL AND column2 IS NULL 。 ...这将导致那些在标签表中没有 count() 值的行 哦,我用 SQLite Manager for firefox,它是一个扩展。有点慢,但效果很好,如果你在那里运行代码就会显示错误 我注意到在您的示例中,您在日期字段中明确定义了时间。在我的示例中,我只指定了一个没有时间的日期,这可能是匹配正确记录方面的问题吗?

以上是关于SQLite - 从 myTable 插入到 myTable 中选择计数 (*) 其中 Date = 'mydate' 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

检查查询是不是在 Android 的 sqlite 中成功

是否可以强制 DbContext.MyTable.Local 成员在 DbContext.SaveChanges() 执行之前分配自动 ID? (EFCore + SQLite)

从Excel文件到SQLite数据库的SQLite插入循环

sqlite 真空与 django

如何在 ipad 中将数据从 xml 插入到 sqlite

Python语言 SQLite怎么用内存数据库解决插入数据时速度慢的问题?