我在下面编写了一个小bash脚本,它按预期工作,但我添加了几个注释和换行符以便于阅读,这打破了代码。删除注释和换行符应该使其成为有效的脚本。
### read all measurements from the database and list each value only once
sqlite3 -init /tmp/timeout /tmp/testje.sqlite \
'select distinct measurement from errors order by measurement;' |
### remove the first line of stdout as this is a notification rather than intended output
sed '1d' |
### loop though all found values
while read error; do
### count the number of occurences in the original table and print that
sqlite3 -init /tmp/timeout /tmp/testje.sqlite \
"select $error,count( measurement ) from errors where measurement = '$error' ;"
done
结果如下:
134 1
136 1
139 2
159 1
问题:sqlite3
是否可以将while
- 循环转换为SQL语句?换句话说,sqlite3是否支持某种for
- 循环来循环查看先前查询的结果?
现在我知道sqlite3
是一个非常有限的数据库,很有可能我想要的东西太复杂了。我一直在寻找,但是我真的是一个数据库笨蛋,到目前为止我得到的点击是在不同的数据库或解决一个完全不同的问题。
最简单的答案(我不希望BTW)是'sqlite3不支持循环'。
答案 0 :(得分:5)
SQLite不支持循环。这是entire language,您会注意到结构化编程完全不存在。
然而,这并不是说你没有循环,使用集合或其他一些SQL结构,你无法得到你想要的东西。在您的情况下,它可能很简单:
select measurement, count( measurement ) from errors GROUP BY measurement
这将为您提供measurement
表中所有errors
的列表,以及每个{{1}}表的频率计数。
通常,最好通过在单个(有时是复杂的)SQL语句中表达您的查询来使用SQL引擎,该语句将提交给引擎进行优化。在您的示例中,您已经编写了一些关于用于从数据库获取数据的策略的决策 - 这是SQL的一个原则,引擎能够比程序员更好地做出这些决策。