2016-10-26 8 views
0

SQLite DBに次の列があります。次の行の値を持つ行を更新するsqlite

 
id,ts,origin,product,bid,ask,nextts 
1,2016-10-18 20:20:54.733,SourceA,Dow,1.09812,1.0982, 
2,2016-10-18 20:20:55.093,SourceB,Oil,7010.5,7011.5, 
3,2016-10-18 20:20:55.149,SourceA,Dow,18159.0,18161.0, 

どのように私は、同じソースから、同じ製品(TS)については、次のタイムスタンプを持つ「次のタイムスタンプ」列(nextts)を取り込むことができますか?私は次のことを試してきましたが、UPDATE文にサブクエリを置くことはできません。

UPDATE TEST a SET nextts = (select ts 
    from TEST b 
    where b.id> a.id and a.origin = b.origin and a.product = b.product 
    order by id asc limit 1); 

これを呼び出すと表示できますが、まだ値を更新する方法が見つかりませんでした。

select a.*, 
    (select ts 
    from TEST b 
    where b.id> a.id and a.origin = b.origin and a.product = b.product 
    order by id asc limit 1) as nextts 
from TEST a 
order by origin, a.id; 
+0

エラーメッセージを秘密にしていただきありがとうございます。 –

答えて

1

問題が許可されていないUPDATE文では、テーブル用のテーブルの別名を使用していることです。 (SELECTのためのエイリアスの参照を維持しながら)あなたはこのように、そこから別名をスキップし、非エイリアスを使用(ただし、テーブル名接頭辞)その列を参照することができます。テーブル名を持つ非エイリアスカラム参照を前置

UPDATE TEST 
    SET nextts = (
      SELECT b.ts 
      FROM TEST b 
      WHERE b.id > TEST.id AND 
        TEST.origin = b.origin AND 
        TEST.product = b.product 
      ORDER BY b.id ASC 
      LIMIT 1 
     ); 

が必要ですあなたがunaliasedテーブルを参照していることをSQLiteが識別するために。そうでない場合、id列は可能な最も近い[*]データソースからのidと理解できます。この場合、エイリアステーブル(bエイリアス)ですが、unaliasedテーブルに興味がありますので、SQLiteそれ。

[*]最も近いデータソースは、同じクエリ、親クエリ、または親の親クエリなどにリストされているものです。SQLiteはクエリの最初のデータソース(内部から外部へ)を探していますこの列を定義する階層。

+0

何らかの理由でnullが返されます。私がこれをすると、 'b.id = 5'のように動作します。私もこれを試したが、役に立たなかった。 'キャスト(整数としてのb.id)>(キャスト(整数としてのID))' – user2146441

+0

私は答えを更新しました。私はあなたのサンプルCSVデータに対してそれをテストして、それは今私のために働く。 – Googie

関連する問題