2012-04-17 6 views
0

私が持っている二つのテーブル:SQL:グループと更新を組み合わせる?

events

mac | na 
---------- 
abc | (null) 
abc | (null) 
def | (null) 

enrichments

mac | na | timestamp 
--------------------- 
abc | na1 | 1 
abc | na2 | 2 
abc | na3 | 3 
def | na4 | 1 

は、今私は、enrichments.naの値を持つevents.na列を更新する場所mac試合、そしてtimestampはその特定のmacのために最大timestampです。

この例では、結果は次のようになります。

abc | na3 
abc | na3 
def | na4 

これを行うための最も効率的な方法だろうか?

ありがとうございます!

+1

を使用してSQL Serverで動作するはず? –

+0

これはHyperSQL(HSQLDB)になります。 –

+1

テーブル 'events'に同じ行が2つあるのはなぜですか? –

答えて

1
UPDATE events AS e 
SET na = 
    (SELECT n.na 
     FROM enrichments AS n 
     WHERE n.mac = e.mac 
     ORDER BY n.timestamp DESC 
     FETCH FIRST 1 ROWS ONLY 
    ) 
+0

適切なマニュアルへのリンクをありがとう。私は答えを書いている最中だったので、データベースシステムを明確にするコメントは見ませんでした。 –

+0

@AndriyM:あなたはなぜあなたの答えを削除しましたか?それはおそらくうまく動作します。 –

+0

本質的にあなたのものと同じなので、私は正しい構文を知らなかった(なぜOPがどの製品を使っているのか分からなかったので)。適切なマニュアルを探していれば、答えは変わらないはずです。 –

1

これは、あなたがどのようなデータベースを使用している共通テーブル式

create table events (mac nvarchar(3), na nvarchar(3)) 
insert into events values ('abc',null); 
insert into events values ('abc',null); 
insert into events values ('def',null); 

create table enrichments (mac nvarchar(3), na nvarchar(3), timestamp int) 
insert into enrichments values ('abc','na1',1) 
insert into enrichments values ('abc','na2',2) 
insert into enrichments values ('abc','na3',3) 
insert into enrichments values ('def','na4',1) 

with latestEnrichment (mac, latestTimestamp) as 
    (select mac, MAX(timestamp) 
    from enrichments 
    group by mac) 
update events 
set  na = en.na 
from events e join enrichments en on e.mac = en.mac 
     join latestEnrichment le on en.timestamp = le.latesttimestamp and 
     en.mac = le.mac 
関連する問題