goodbytes
Goto Top

Spalte mit identischem Inhalt einer anderen Spalte einer Tabelle befüllen

Hallo,
es ist sicherlich nur eine Kleinigket für einen DB-Spezi.

Ich möchte in einer DB2-Datenbank eine Tabelle durchlaufen und genau den Wert einer Spalte in dem selben Datensatz einer anderen Spalte kopieren, also den Inhalt zweiten Spalte wirklich komplett überschreiben.

So halt die ganze Tabelle durchlaufen.

Die Syntax von Transakt-SQL ist mir schon ein wenig bekannt, bei Abfragen weniger ein Problem, allerdings wenn ich schreibend auf die Datenbank zugreife werde ich sehr vorsichtig. Gerade wenn es sich um eine Produktiv-Datenbank handelt.

Es handelt sich um eine DB2-Datenbank, auf welche ich mittels SQL Anywhere zugreife.

Vielleicht kann mir Jemand auf die Schnelle helfen?

Vielen Dank schon mal im Voraus !!!

Gruß
Torsten

Content-Key: 189247

Url: https://administrator.de/contentid/189247

Printed on: April 19, 2024 at 05:04 o'clock

Member: Biber
Biber Aug 08, 2012 at 03:59:21 (UTC)
Goto Top
Moin TorstenB,

DB2 verhält sich bei deinem Problem auch nicht anders als andere Datenbanken.
Die formal richtige Antwort wäre also:
Update dieTabelle SET feld1 = feld2 Where (1=1);

... mit den Anmerkungen:
  • feld1 und feld2 sollten schon vom gleichen Datentyp, der gleichen Länge und auch bezüglich Nullable/not nullable gleich oder zumindest verträglich sein
  • wenn es eine Produktivdatenbanktabelle mit 37 Milliarden Datensätzen ist, dann wirst du mit EINEM Update nicht durchkommen ohne COMMIT, Du wirst die WHERE-Clause von "Where (1=1)" (== alle) ändern müssen in sinnvolle Portionierungen zu max 100000 Datensätzen.

Grüße
Biber
Member: goodbytes
goodbytes Aug 08, 2012 at 06:42:23 (UTC)
Goto Top
Moin Biber,
vielen Dank für die schnelle Hilfe !!! face-smile

Nein, so eine riesige Datenbank ist es nicht. Da kann ich es mit "Where (1=1)" ruhig machen.

Ich hab mir in der Nacht einfach schnell ein Testsystem (1:1 Kopie der Originalmaschine; ist eh auf Hyper-V) und werde es darauf mal testen, bevor etwas schief geht.

Nur mal interessehalber, wie sehe es aus, wenn es sich um zwei verschiedene Tabellen handelt?

Gruß
Torsten
Member: Biber
Biber Aug 08, 2012 updated at 07:58:01 (UTC)
Goto Top
Moin Torsten,

Nur mal interessehalber, wie sehe es aus, wenn es sich um zwei verschiedene Tabellen handelt?
Gegenfrage: Willst du denn Feld1 in allen Datensätzen der Tabelle1 mit dem Feldinhalt von Feld2 jeden Satzes aus Tabelle2 ersetzen?

Wenn nicht, dann müsstest du mal ein Beispiel nennen, über welches Kriterium die beiden Tabellen denn verknüpfbar sind.

SQL-Statements feuere ich zwar gern auf ungedeckte Produktivtabellen ab, aber selten gegen wehrlose Glaskugeln.

Grüße
Biber
Member: goodbytes
goodbytes Aug 08, 2012 at 07:22:02 (UTC)
Goto Top
Hi Biber,
naja, es ist ja nur eine theoretische Frage.

Die Tabellen wären natürlich über einen eindeutigen Primärschlüssel 1:1 verbunden.

Gruß
Torsten
Member: Biber
Biber Aug 08, 2012 updated at 07:57:07 (UTC)
Goto Top
Moin TorstenB,

na ja, zu theoretischen Fragen habe ich schon seit den Tagen meiner Kriegsdienstverweigerung ein gespaltenes Verhältnis.

Wenn du schon bezüglich Tabellen- und Feldnamen nich' Butter bei die Fische geben willst, dann wäre wenigstens eine etwas konkretere Benennung des Datenbankblechs sinnvoll ( DB2 LUW? DB2 iSeries? Db2 AS400? DB2 z/OS? v8.x? v9.1? v9.5? v10?).

Bei den LUW-Versionen ab 9.5 würde ich die (flinkere) MERGE-Syntax verwenden:

MERGE INTO Tabelle1 T USING (  select samePKFeld, FeldInSource from Tabelle2) S  
  ON T.samePKFeld = S.samePKFeld
WHEN MATCHED THEN UPDATE SET T.FeldImTarget = S.FeldInSource;

In allen anderen (oder versionsmäßig kleineren) DB2-Varianten:
UPDATE Tabelle1 T 
SET  (T.FeldImTarget) = (
    SELECT S.FeldImSource from Tabelle2 S   Where S.SamePKFeld = T.SamePKFeld
   ) 
WHERE EXISTS(SELECT 1 FROM Tabelle2 S WHERE T.SamePKFeld = S.SamePKFeld);

P.S. Wir können die Felder auch "Heinz" und "Gerda" nennen, falls du irgendeine Vertraulichkeitserklärung unterschrieben hast.

Grüße
Biber
Member: goodbytes
goodbytes Aug 08, 2012 at 08:27:45 (UTC)
Goto Top
Hi Biber,
für meinen momentanen Fall mit einer Tabelle reicht ja die erste Lösung.

Die zweite Variante könnte aber auch öfters vorkommen.

Zur Version, "db2level gives" gibt mir DB2 v9.7 ... Fixpak 4 aus.

Ein Beispiel (auch wenn es etwas unsinnig klingt jetzt):

In Tabelle A habe ich eine lange Liste mit Namen. In Tabelle B stehen nur Orte.
In Tabelle A verweist eine Spalte A.Wohnorte_OID auf Einträge der Tabelle B.OID.
Das ist also die Verbindung.

Da ich aber in Tabelle A eine nicht mehr benötigte Spalte übrig habe, habe ich aus Langeweile face-wink nix besseres zu tun, als diese Spalte mit den zugehörigen Werten aus der entsprechenden Spalte der Tabelle B zu holen, nennen wir sie B.Ortsbezeichnung, so dass bei jedem Datensatz der Tabelle A auch der Ort vorhanden ist.

Wie ich die Daten herausziehe ist klar ... Where A.Wohnorte_OID = B.OID ...
Und wie schreibe ich sie jetzt rein?

Bissl umständlich beschrieben, aber ich hoffe es war halbwegs verständlich.

Gruß
Torsten
Member: Biber
Biber Aug 08, 2012 at 09:00:11 (UTC)
Goto Top
Moin TorstenB,

wie jezz' ???
Du willst die normalisierte Beziehung wieder denormalisieren?
Eine Excel-like-Tabelle daraus machen??
Alle Ortsbezeichnungen (mit Stand vom 07.08.2012) nochmals aus einer Tabelle in die andere kopieren???
Damit es dann NOCH kosistenten wird als vorher?
Und dafür ein "überflüssig gewordenes" Textfeld in der Tabelle recyclen?

Nö.

Den Inhalt von Tabelle2.feldx in Tabelle1.feldy zu kopieren, das ist vielleicht sinnvoll, wenn es in Tabelle1 größenordnungsmäßig ähnlich viele Datensätze gibt wie Werte in tabelle2.Feldy.

Sprich: Du hast in Tabelle1 10000 eindeutige Vor/Nachnamenskombinationen mit Adressen und bekommst für diese 10000 Vor/Nachnamenskombinationen nun in Tabelle2 die Telefonnummern dazu. Diese Tabellen kannst du zu einer zusammenfassen. Weil sicherlich ziemlich jede(r eine Telefonnummer hat.

Aber bei PLZ/Ortsangaben ist eine FK-Relation sinnvoller, weil du doch in einer Tabelle 10000 Datensätze vorliegen hast, in der anderen aber doch nur 500 Datensätze.

Oder wie sind bei dir die Größenverhältnisse der beiden Tabellen?

Grüße
Biber
Member: goodbytes
goodbytes Aug 08, 2012 updated at 15:21:16 (UTC)
Goto Top
Hi Biber,
naja, das war vielleicht ein blödes Beispiel. In dem Beispiel, wo ich es anwenden könnte geht es darum, dass bei den jetzt vorhandenen Datensätzen die leere Spalte in der Tabelle A mit den Werten einmalig vorbelegt wird.

Bei mehreren Datensätzen wird dieser vorbelegte Wert überschrieben; bei neuen Datensätzen soll er sowieso manuell angelegt werden.

Ansonsten wäre es natürlich absoluter Unsinn, wie du sagst. Das hätte ja nix sinnvolles mit dem Prizip einer Datenbank zu tun...

Gruß
Torsten

Edit:

Es hat mit dem Select in der Update-Anweisung prima geklappt.

Danke Biber !!! face-smile