Re: SQL: Update auf Tabelle mit zusammgesetztem PrimärschlüsselPosted ByRaimund on February 15, 19100 at 20:16:07: In Reply to: SQL: Update auf Tabelle mit zusammgesetztem Primärschlüssel posted byCarsten Kohlmann on February 15, 19100 at 16:22:05: : Ich habe zwei Tabellen mit einem zusammgesetztem Primärschlüssel (z.B. : (Firma_Nr, Abt_Nr) = PK ). : Nun möchte ich ein update auf Tabelle tab_a machen, und zwar möchte ich : nur die Sätze aktualisieren die in Tabelle tab_b vorhanden sind (mit dem : Inhalt von tab_b). : create table tab_a : ( : PK_a1 : PK_a2 : Daten_A : Daten_B : ) : : create table tab_b : ( : PK_b1 : PK_b2 : Daten_C : Daten_D : ) : die Syntax unter Oracle für ein korrektes Update lautet: : update tab_a : set ( Daten_A, Daten_B ) = : ( select Daten_C, Daten_D : from tab_B : where PK_b1 = PK_a1 : and PK_b2 = PK_a2 : ) : where ( PK_a1, PK_a2) in : ( select PK_b1, PK_b2 : from tab_B : ) : Funktioniert aber nicht auf AS/400. : Ein ähnliches Beispiel habe ich in der DB2-Literatur gefunden, leider : nur nicht für DB2-AS/400. : Ich kann mir aber nicht vorstellen, dass es für dieses Problem keine : Lösung gibt. Hier mein Versuch auf unserer Maschine mit leicht abgewandelten Feldnamen: diese "in" Funktion scheint auf der AS/400 nicht zu klappen (zumindest nicht bei einem Release bis V4R3M0) versuchen sie die beiden Felder durch CONCAT oder || zu verbinden und dann ergibt sich ein subquery mit gleich Dies sollte klappen: Mein Beispiel nach Ihren Angaben mit gemischten Schlüssel numerisch und Alpha-Feld update taba set (datena, datenb) = (select datenc, datend from tabb where pkb1 = pka1 and pkb2 = pka2) where digits(pka1)||pka2 = (select digits(pkb1)||pkb2 from tabb where pka1 = pkb1 and pka2 = pkb2) Tabellen vor Update: Taba:
PKA1 PKA2 DATENA DATENB 1 A A 1 2 B B 2 Tabb: PKB1 PKB2 DATENC DATEND 1 A B 2 2 B A 1 Taba nach obigem Statement:
PKA1 PKA2 DATENA DATENB 1 A B 2 2 B A 1 Entweder || oder CONCAT zum Verbinden nehmen: 2. Version: update taba set (datena, datenb) = (select datenc, datend from tabb where pkb1 = pka1 and pkb2 = pka2) where digits(pka1) CONCAT pka2 = (select digits(pkb1) CONCAT pkb2 from tabb where pka1 = pkb1 and pka2 = pkb2) Create Statements: CREATE TABLE TABA(PKA1 DEC (7, 0) NOT NULL WITH DEFAULT, PKA2 CHAR (5) NOT NULL WITH DEFAULT, DATENA CHAR (5) NOT NULL WITH DEFAULT, DATENB DEC (7, 0) NOT NULL WITH DEFAULT) CREATE TABLE TABb(PKB1 DEC (7, 0) NOT NULL WITH DEFAULT, PKB2 CHAR (5) NOT NULL WITH DEFAULT, DATENC CHAR (5) NOT NULL WITH DEFAULT, DATEND DEC (7, 0) NOT NULL WITH DEFAULT)
Mir freundlichen Grüßen Raimund Selb
|