Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Datenbanken

Mitglied: goodbytes

goodbytes (Level 2) - Jetzt verbinden

07.08.2012, aktualisiert 22:22 Uhr, 8358 Aufrufe, 8 Kommentare

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
Mitglied: Biber
08.08.2012 um 05:59 Uhr
Moin TorstenB,

DB2 verhält sich bei deinem Problem auch nicht anders als andere Datenbanken.
Die formal richtige Antwort wäre also:
01.
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
Bitte warten ..
Mitglied: goodbytes
08.08.2012 um 08:42 Uhr
Moin Biber,
vielen Dank für die schnelle Hilfe !!!

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
Bitte warten ..
Mitglied: Biber
08.08.2012, aktualisiert um 09:58 Uhr
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
Bitte warten ..
Mitglied: goodbytes
08.08.2012 um 09:22 Uhr
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
Bitte warten ..
Mitglied: Biber
08.08.2012, aktualisiert um 09:57 Uhr
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:

01.
MERGE INTO Tabelle1 T USING (  select samePKFeld, FeldInSource from Tabelle2) S   
02.
  ON T.samePKFeld = S.samePKFeld 
03.
WHEN MATCHED THEN UPDATE SET T.FeldImTarget = S.FeldInSource;
In allen anderen (oder versionsmäßig kleineren) DB2-Varianten:
01.
UPDATE Tabelle1 T  
02.
SET  (T.FeldImTarget) = ( 
03.
    SELECT S.FeldImSource from Tabelle2 S   Where S.SamePKFeld = T.SamePKFeld 
04.
   )  
05.
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
Bitte warten ..
Mitglied: goodbytes
08.08.2012 um 10:27 Uhr
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 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
Bitte warten ..
Mitglied: Biber
08.08.2012 um 11:00 Uhr
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
Bitte warten ..
Mitglied: goodbytes
08.08.2012, aktualisiert um 17:21 Uhr
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 !!!
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Microsoft Office
gelöst Bereich mit variablen Bereich in einer anderen Tabelle (7)

Frage von mreske zum Thema Microsoft Office ...

Datenbanken
Spalte in einer SQL-Tabelle auslesen. Werte durch Tab getrennt! (4)

Frage von Janekr77 zum Thema Datenbanken ...

VB for Applications
gelöst Excel VBA .csv Import in Tabelle x, ab Spalte y

Frage von drimrim zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...