2013-07-26 2 views
0

Я написал небольшой скрипт bash ниже, и он работает по назначению, но я добавил пару комментариев и новых строк для чтения, что нарушает код. Удаление комментариев и новых строк должно сделать его действительным скриптом.Поддерживает ли циклы поддержки sqlite3?

### 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 -loop на заявления SQL? Другими словами, поддерживает ли sqlite3 какой-то for -loop, чтобы просмотреть результаты предыдущего запроса?

Теперь я знаю, что sqlite3 - очень ограниченная база данных, и, скорее всего, то, что я хочу, слишком сложно для него. Я искал для него, но я действительно нитвит базы данных, и хиты, которые я получаю до сих пор, либо находятся в другой базе данных, либо решают совершенно другую проблему.

Самый простой ответ (который я не надеюсь на BTW): «sqlite3 не поддерживает петли».

ответ

3

SQLite не поддерживает циклы. Вот entire language, вы заметите, что структурированная программа полностью отсутствует.

Однако это не означает, что вы не можете получить то, что хотите, без циклов, вместо этого используйте наборы или какую-либо другую конструкцию SQL. В вашем случае это может быть столь же просто, как:

select measurement, count(measurement) from errors GROUP BY measurement 

Это даст вам список всех measurement с в errors таблицы и подсчет того, как часто происходит каждый один.

В целом, SQL-двигатели лучше всего использовать, выражая ваш запрос в одном (иногда сложном) операторе SQL, который передается движку для оптимизации. В вашем примере вы уже кодифицировали некоторые решения о стратегии, используемой для получения данных из базы данных - это принцип SQL, который движок лучше способен принимать эти решения, чем программист.

+0

Это похоже на работу! Я не понимал, что могу использовать «GROUP» в сочетании с count(). Я довольно привык к тому, чтобы скрыть все вместе, отсюда мой маленький сценарий. – jippie

Смежные вопросы