0

私はこのようなテーブル「ダミー」を持っています

name, status , date, is-updated
n1, s1, 2013-09-01, false
n2, s2, 2013-09-01, false
n1, s11, 2013-09-02, false

特定の名前の最新のタイムスタンプを取得するために、次のクエリを使用しています。

select name, status, max(date)
from dummy
where is-updated=false
group by name,status

これは期待どおりに機能しており、2行が返されます

n2, s2, 2013-09-01, false
n1, s11, 2013-09-02, false

上記の 2 行の「is-updated」値を「true」に更新する方法は?? SQL の 'IN' 句は複数の列をサポートしていません。

update dummy
set is-updated = true
where name, status, date in (

select name, status, max(date)
from dummy
where is-updated=false
group by name,status

)

誰でもこれを手伝ってもらえますか? ありがとう。

4

2 に答える 2

0

さらに情報を提供してください。これを更新して改善します。

update dummy as d 
     join ( 
       select name, max(modifieddate) as max_mod
       from dummy 
       where is_updated = FALSE 
       group by name ) as max_mod_tbl
      on max_mod_tbl.name = d.name and 
         max_mod_tbl.max_mod = d.modifieddate and 

set is_updated = true 

where d.is_updated = false 

http://www.sqlfiddle.com/#!2/26bad/1/0

私が追加 したのは...ステータスが異なるrows_you_want_to_change.is-updated = d.is-updated2つの行がある場合に備えてelect name, status, max(date) as dtis-updated

キーフィールドのように。そのクエリは、返されると言う行と一致しません..?

于 2013-09-06T18:40:54.573 に答える
0

updateと を使用してこれを行うことができますjoin。適切な構文は次のとおりです。

update dummy join
       (select name, status, max(date) as maxdate
        from dummy
        where `is-updated` = false
        group by name, status
       ) toupdate
       on dummy.name = toupdate.name and
          dummy.status = toupdate.status and
          dummy.date = toupdate.maxdate
    set `is-updated` = true;

はフィルタリングを行うため、句joinは必要ありません。where

于 2013-09-06T18:45:07.210 に答える