Обновление Sybase SQL с самостоятельным объединением - PullRequest
2 голосов
/ 05 января 2011

Какой синтаксис в 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 <>'.Как правильно это сделать?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 января 2011

Это работает:

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 читал 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 
0 голосов
/ 05 января 2011

Вы пробовали

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' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...