2

自己結合で更新を行うSybase SQLの正しい構文は何ですか? たとえば、以下の表 (#tmptbl) があるとします。

account | client  |amount | date
-------------------------------------
ACT1    | CLIENTA | 12    |2010-12-30
ACT2    | CLIENTB | 5     |2010-12-30
ACT1    | CLIENTA | 17    |2010-12-31
ACT2    | CLIENTB | 6     |2010-12-31

2010 年 12 月 31 日の金額を 2010 年 12 月 30 日の金額で上書きしたいと考えています。

次のようなことを書きたいと思います。

update old
set old.amount = new.amount
from #tmptbl old,  #tmptbl new
where 
/*filter old*/
old.account = 'ACT1' 
and old.date = '2010-12-30' 
and old.client = 'CLIENTA' 
/* self-join new and old*/
and old.account = new.account 
and old.client = new.client 
/* filter new */
and new.date = '2010-12-31' 

しかし、Sybase が 'update <>' 句でエイリアスを受け入れるようには見えません。これを行う適切な方法は何ですか?

ありがとう!

4

2 に答える 2

4

これは機能します:

update #tmptbl
set old.amount = new.amount
from #tmptbl old,  #tmptbl new
where 
/*filter old*/
old.account = 'ACT1' 
and old.date = '2010-12-30' 
and old.client = 'CLIENTA' 
/* self-join new and old*/
and old.account = new.account 
and old.client = new.client 
/* filter new */
and new.date = '2010-12-31' 
go

更新しているテーブルのエイリアスを省略した場合、つまりset amount = new.amount、Sybase は更新しているテーブルを from 句で最初from #tmptbl new, #tmptbl oldに一致したテーブルに関連付けます。

出力:

 account     client     amount     date             
 ----------  ---------  ---------  ---------------- 
 ACT1        CLIENTA    12         30/12/2010 00:00 
 ACT2        CLIENTB    5          30/12/2010 00:00 
 ACT2        CLIENTB    6          31/12/2010 00:00 
 ACT1        CLIENTA    12         31/12/2010 00:00 
于 2011-01-05T16:14:17.660 に答える
0

やってみました

update #tmptbl 
set amount = new.amount
from #tmptbl old,  #tmptbl new
where 
/*filter old*/
old.account = 'ACT1' 
and old.date = '2010-12-30' 
and old.client = 'CLIENTA' 
/* self-join new and old*/
and old.account = new.account 
and old.client = new.client 
/* filter new */
and new.date = '2010-12-31' 
于 2011-01-05T16:12:43.180 に答える