2011-01-05 6 views
2

Wie lautet die richtige Syntax in Sybase SQL, um ein Update mit einem Self-Join durchzuführen? Z.B. vorausgesetzt, Sie das unten stehende Tabelle (#tmptbl) haben:Sybase SQL-Update mit Self-Join

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 

ich die Beträge, die auf 2010-12-31 mit den Mengenwerten von 2010-12-30 überschrieben werden soll.

Ich fühle mich wie so etwas wie dieses zu schreiben:

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' 

Aber es sieht nicht wie Sybase einen Alias ​​in der ‚aktualisieren <>‘ akzeptiert Klausel. Was ist der richtige Weg, dies zu tun?

Danke!

Antwort

4

Dies funktioniert:

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 

Wenn Sie den Alias ​​der Tabelle auslassen Sie aktualisieren, dh set amount = new.amount dann Sybase ordnet die Tabelle, die Sie mit der Aktualisierung werden erste passende Tabelle in der Klausel von, so in diesem Fall für Ihr Update zu arbeiten, müssten Sie die von from #tmptbl new, #tmptbl old lesen.

Ausgang:

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

Ist das, warum, wenn ich "set.amount = old.amount von # tmptbl alt, #tmptbl new" ich habe "Warnung: Mehrdeutige Tabelle zum Aktualisieren; Verwenden der in der update-Klausel angegebenen Tabelle."? – naumcho

+0

Sehr nützlich, danke! –

0

Haben Sie

versucht
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' 
+0

Yep - Werke, danke. Hatte die andere Antwort zu akzeptieren, da es ein bisschen detaillierter war. – naumcho

+0

@ user779 das ist in Ordnung. Ich rate sowieso, seit es ein gutes Jahrzehnt ist, seit ich eine Sybase DB habe, um mit zu spielen :) –