1

以下に小さな 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

質問: -loop を SQL ステートメントsqlite3に変換することは可能ですか? while言い換えれば、sqlite3forは、前のクエリの結果をループするために、ある種の -loop をサポートしていますか?

は非常に限られたデータベースであり、必要sqlite3なものは複雑すぎる可能性があります。私はそれを探してきましたが、私は実際にはデータベースのオタクであり、これまでに得たヒットは別のデータベースであるか、まったく別の問題を解決しています.

最も簡単な答え (ところで私は望んでいません) は、「sqlite3 はループをサポートしていません」です。

4

1 に答える 1

7

SQLite はループをサポートしていません。これが言語全体です。構造化プログラミングがまったくないことがわかります。

ただし、代わりにセットまたはその他の SQL 構造を使用して、ループなしで必要なものを取得できないと言っているわけではありません。あなたの場合、それは次のように簡単かもしれません:

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

measurementこれにより、テーブル内のすべての のリストerrorsと、それぞれの発生頻度が表示されます。

一般に、SQL エンジンは、最適化のためにエンジンに送信される単一の (複雑な場合もある) SQL ステートメントでクエリを表現することによって最適に利用されます。あなたの例では、データベースからデータを取得するために使用される戦略に関するいくつかの決定をすでに体系化しています。これは、エンジンがプログラマーよりもそれらの決定を行うことができるという SQL の信条です。

于 2013-07-26T19:57:59.213 に答える