NEWSboard Internet-Museum für das Schwarze Brett der AS/400

      Re: SQL: Update auf Tabelle mit zusammgesetztem Primärschlüssel


      [ Follow Ups ] [ Neuen Beitrag verfassen! ] [ Schwarzes Brett ] [ FAQ ]

      Posted 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





      Follow Ups



      Neuen Beitrag verfassen!

      Name:
      E-Mail:

      Subject:

      Comments: