Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Daten innerhalb einer Tabelle vervielfältigen (https://www.delphipraxis.net/185287-daten-innerhalb-einer-tabelle-vervielfaeltigen.html)

PistolenPeter 28. Mai 2015 10:04


Daten innerhalb einer Tabelle vervielfältigen
 
Hallo zusammen,

ich möchte innerhalb einer Tabelle mehrere Felder updaten.

Tabelle (Beispiel)
__A____B____C____D____E____F____G__
1111   
11125500007
1113   
11215500008
1122   
12116600009
1212   
1213   
1221   
12227700010
1223   

Ich möchte jetzt die Felder E und F updaten.
Die Werte von E und F sollen überall dort eingetragen werden, wo die Felder A, B und C gleich sind mit den Feldern A, B und C der Records, die in G einen Wert haben.
Es gibt also für jeden Wert in G mehrere Records, die in den Feldern A, B und C übereinstimmen. Die Werte aus E und F möchte in bei diesen Records updaten.
Ich weiß leider nicht, wie ich es besser beschreiben soll. Ich hoffe, ihr versteht mich. :wiejetzt:

Das Problem ist, dass die Tabelle nicht ansatzweise Normalisiert ist, aber uralt und ich keine Möglichkeit habe, an der Struktur zu ändern.
Es muss also irgendwie anders gehen. Und da brauche ich ein bisschen Unterstützung.


Das Ergebnis soll so aussehen:
__A____B____C____D____E____F____G__
111155 
11125500007
111355 
11215500008
112255 
12116600009
121266 
121366 
122166 
12227700010
122377 

Wenn mir jemand bei der SQL Anweisung helfen könnte, wäre das himmlisch und ich sehr dankbar.

Beste Grüße
PistolenPeter

mkinzler 28. Mai 2015 10:12

AW: Daten innerhalb einer Tabelle vervielfältigen
 
Hat die Tabelle einen Primärschlüssel?

Mikkey 28. Mai 2015 10:17

AW: Daten innerhalb einer Tabelle vervielfältigen
 
Mal so ins Blaue geschossen:

Code:
Update tabelle tu
Set E=(Select E FROM tabelle tl WHERE tl.A=tu.A and tl.B=tu.B and tl.B=tu.B AND tl.G <> 0),
    F=(Select F FROM tabelle tl WHERE tl.A=tu.A and tl.B=tu.B and tl.B=tu.B AND tl.G <> 0)
WHERE tu.G = 0

PistolenPeter 28. Mai 2015 10:22

AW: Daten innerhalb einer Tabelle vervielfältigen
 
@mkinzler: leider gibt es keinen PK.
Den könnte ich hinzufügen, das wäre dann nur nichts anderes als eine bessere ROW_NUMBER.

@Mikkey: Ich versuch's mal sofort.

Grüße
PistolenPeter

mkinzler 28. Mai 2015 10:26

AW: Daten innerhalb einer Tabelle vervielfältigen
 
Ich würde es so versuchen:

SQL-Code:
update (
  select
    t1.a, t1.b, t1.c, t1.e te, t1.f tf, t2.e, t2.f
  from
    <Tabelle> t1
      join <Tabelle> t2 on t2.a = t1. a and t2.b = t1.b and t2.c = t1.c and t2.g is not null
  where
    t1.g is null)
set
  e = t1, f = tf;

PistolenPeter 28. Mai 2015 13:02

AW: Daten innerhalb einer Tabelle vervielfältigen
 
@Mikkey:
Funktioniert leider nicht.
Es gibt ein Update für eine Zeile, aber die Daten in der Tabelle ändern sich nicht.

@mkinzler:
Das klappt leider auch nicht. Oracle sagt:
SQL-Fehler: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly.

Wenn ich das richtig verstehe, funktioniert das nur, wenn es einen Primärschlüssel gibt UND dieser in dem JOIN enthalten ist.

Grüße
PistolenPeter

mkinzler 28. Mai 2015 13:16

AW: Daten innerhalb einer Tabelle vervielfältigen
 
Das habe ich berfürchtet

null ist nicht das selbe wie 0

SQL-Code:
Update tabelle tu
Set E=(Select E FROM tabelle tl WHERE tl.A=tu.A and tl.B=tu.B and tl.B=tu.B AND tl.G is not null),
    F=(Select F FROM tabelle tl WHERE tl.A=tu.A and tl.B=tu.B and tl.B=tu.B AND tl.G is not null)
WHERE tu.G is null;

p80286 28. Mai 2015 14:20

AW: Daten innerhalb einer Tabelle vervielfältigen
 
Zitat:

Zitat von PistolenPeter (Beitrag 1303401)
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly.

Bei der Tabelle handelt es sich um einen View und nicht um eine Tabelle?

(Naja ein PK ist eigentlich nie falsch, auch wenn er nur eine "Zeilennummer" ist)

Gruß
K-H

PistolenPeter 28. Mai 2015 14:22

AW: Daten innerhalb einer Tabelle vervielfältigen
 
Zitat:

Zitat von mkinzler (Beitrag 1303403)
Das habe ich berfürchtet

null ist nicht das selbe wie 0

SQL-Code:
Update tabelle tu
Set E=(Select E FROM tabelle tl WHERE tl.A=tu.A and tl.B=tu.B and tl.B=tu.B AND tl.G is not null),
    F=(Select F FROM tabelle tl WHERE tl.A=tu.A and tl.B=tu.B and tl.B=tu.B AND tl.G is not null)
WHERE tu.G is null;

Das klappt. Und ich verstehe sogar was da passiert :-D

Vielen Dank!
PistolenPeter

PistolenPeter 28. Mai 2015 14:24

AW: Daten innerhalb einer Tabelle vervielfältigen
 
Zitat:

Zitat von p80286 (Beitrag 1303408)
Bei der Tabelle handelt es sich um einen View und nicht um eine Tabelle?

Hallo K-H,

nein, es ist kein View, aber durch den JOIN entseht ja so etwas wie ein View.

Grüße
Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz