Python 为什么SQLite3不产生错误
我对SQL非常陌生,但我正在尝试修复SQL查询的输出。然而,这个问题与bug无关,而是为什么SQLite3在应该产生错误时不产生错误 我的查询字符串如下所示:Python 为什么SQLite3不产生错误,python,sqlite,Python,Sqlite,我对SQL非常陌生,但我正在尝试修复SQL查询的输出。然而,这个问题与bug无关,而是为什么SQLite3在应该产生错误时不产生错误 我的查询字符串如下所示: QueryString = ("SELECT e.event_id, " "count(e.event_id), " "e.state, " "MIN(e.boot_time) AS boot_time, " "e.time_occurred, " "COALESCE(e.info, 0) AS
QueryString = ("SELECT e.event_id, "
"count(e.event_id), "
"e.state, "
"MIN(e.boot_time) AS boot_time, "
"e.time_occurred, "
"COALESCE(e.info, 0) AS info "
"FROM events AS e "
"JOIN leg ON leg.id = e.leg_id "
"GROUP BY e.event_id "
"ORDER BY leg.num_leg DESC, "
"e.event_id ASC;\n"
)
这将产生一个没有错误的输出
我不明白的是,为什么按e.event_id和e.state以及e.time_occurrent分组时没有错误,它不包含聚合函数,也不属于GROUP BY语句的一部分
e、 state是一个字符串列。e、 发生的时间是一个整数列
我正在使用Python中的查询字符串。为了与MySQL兼容,这是允许的。(非聚合列值来自组中的某个随机行。)
由于SQLite使用min()或max()来确定非聚合列中的值来自组中具有最小/最大值的行。为了与MySQL兼容,这是允许的。(非聚合列值来自组中的某个随机行。)
自SQLite以来,使用min()或max()可以确保非聚合列中的值来自组中具有最小/最大值的行。SQLite和MySQL允许聚合查询中出现裸列。下文对此进行了解释: 在上面的查询中,“a”列是GROUPBY子句的一部分,并且 因此,输出的每一行都包含“a”的一个不同值。 “c”列包含在sum()聚合函数中,依此类推 该输出列是具有 “a”的值相同。但是“b”列的结果是什么?这个 答案是“b”结果将是其中一个表达式中“b”的值 构成聚合的输入行。问题是你通常是这样做的 不知道哪个输入行用于计算“b”,在许多情况下也是如此 “b”的值未定义 您的具体查询是:
SELECT e.event_id, count(e.event_id), e.state, MIN(e.boot_time) AS boot_time,
e.time_occurred, COALESCE(e.info, 0) AS info
FROM events AS e JOIN
leg
ON leg.id = e.leg_id "
GROUP BY e.event_id
ORDER BY leg.num_leg DESC, e.event_id ASC;
如果
e.event\u id
是events
中的主键,那么ANSI标准甚至支持这种语法,因为event\u id
足以在events中唯一定义行中的其他列,SQLite和MySQL允许聚合查询中的裸列。下文对此进行了解释:
在上面的查询中,“a”列是GROUPBY子句的一部分,并且
因此,输出的每一行都包含“a”的一个不同值。
“c”列包含在sum()聚合函数中,依此类推
该输出列是具有
“a”的值相同。但是“b”列的结果是什么?这个
答案是“b”结果将是其中一个表达式中“b”的值
构成聚合的输入行。问题是你通常是这样做的
不知道哪个输入行用于计算“b”,在许多情况下也是如此
“b”的值未定义
您的具体查询是:
SELECT e.event_id, count(e.event_id), e.state, MIN(e.boot_time) AS boot_time,
e.time_occurred, COALESCE(e.info, 0) AS info
FROM events AS e JOIN
leg
ON leg.id = e.leg_id "
GROUP BY e.event_id
ORDER BY leg.num_leg DESC, e.event_id ASC;
如果e.event\u id
是events
中的主键,那么ANSI标准甚至支持此语法,因为event\u id
足以唯一地定义events
中一行中的其他列,如果e.event\u id
是表的主键或唯一键,则e.time\u accurrent
称为“功能相关”,甚至不会在其他符合SQL的DBMS中引发错误
然而,SQLite并没有实现功能依赖性。对于SQLite(和MySQL),即使对于功能上不依赖于GROUPBY列的列,也不会抛出错误
SQLite(和MySQL)只需从结果集中选择一个随机行来填充(用SQLite术语)“裸列”,请参见。如果e.event\u id
是表的主键或唯一键,则e.time\u occurrent
称为“功能相关”,甚至不会在其他符合SQL的DBMS中引发错误
然而,SQLite并没有实现功能依赖性。对于SQLite(和MySQL),即使对于功能上不依赖于GROUPBY列的列,也不会抛出错误
SQLite(和MySQL)只需从结果集中随机选择一行来填充(用SQLite的行话)“裸列”,请参见。这是SQLite和MySQL的一个“特性”。在MySQL中,您可以通过服务器中的严格模式设置来纠正这一点。也许在SQLite中也是…好吧。。。你能详细说明这个特性的预期系统行为吗?这是SQLite和MySQL的一个“特性”。在MySQL中,您可以通过服务器中的严格模式设置来纠正这一点。也许在SQLite中也是…好吧。。。您能否详细说明此功能的预期系统行为?