Autor Beitrag
Hazel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 26.04.13 09:54 
Hallo :)

hab ein kleines SQl Problem vill könnt ihr mir ja helfen.
Hab zwei Datenbank tabellen mit Daten die eine Tabelle enthält die 'alten' Daten die andere die neue.
Ich möchte jetzt einen Befehl schreiben der die Daten der alten Tabelle mit der neuen vergleicht gegebenfalls ändert oder
neue hinzufügt. Also der soll quasi schauen ob der Datensatz bereits existiert und wie bereits erwähnt ändern oder neu hinzufügen.
Habt ihr da eine Idee?
schonmal Danke im vorraus
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 26.04.13 10:08 
Welches Datenbanksystem?

Man kann z.B. fehlende Datensätze per SQL suchen:
ausblenden SQL-Anweisung
1:
SELECT ID FROM TABELLE2 T2 WHERE NOT EXISTS(SELECT ID FROM TABELLE1 T1 WHERE T1.ID = T2.ID)					


Oder ein Update von Daten geht in Firebird recht elegant mit UPDATE OR INSERT (ich glaub, ab Version 2.5):
ausblenden SQL-Anweisung
1:
UPDATE OR INSERT INTO TABELLE1 T1 (ID, BEZEICHNUNG) VALUES (1'BLA') MATCHING ID;					

Wenn in der Tabelle schon ein Datensatz mit der ID 1 existiert, wird ein Update mit der neuen Bezeichnung gemacht, andernfalls wird der Datensatz angelegt. Wenn das Feld ID der Primärschlüssel ist, kann man den Teil mit MATCHING weg lassen.
Sonst kann man auch sowas machen:
ausblenden SQL-Anweisung
1:
UPDATE OR INSERT INTO KUNDEN (NACHNAME, VORNAME, ORT) VALUES ('Müller''Heinz''Berlin') MATCHING NACHNAME, VORNAME					

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Hazel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 26.04.13 10:18 
DbForge :)

also es ist so das die Daten in der 'alten' Tabelle anders aufgeteilt sind als in der 'neuen'.
Ich will quasi das der durchgeht. Soll den Datensatz aus der neuen nehmen anhand der Nummer suchen ob es die in der alten Tabellen schon gibt
wenn Ja dann vergleichen ob sie sich geändert hat wenn ja ändern. Wenn nicht existiert neu anlegen. Wenn sich nix geändert hat weiter gehen und mit dem nächsten
Datensatz weiter machen.
Soll ich es lieber in Delphi programmieren oder direkt im SQL?
Bin mir unsicher wie ich es umsetzten soll.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 26.04.13 10:30 
Schneller wird es sein, wenn Du es in SQL machst. Leider sagt mir dbforge nichts, daher kann ich zu spezielle Sprachfeatures nichts sagen.

Aber generell würde ich es in der Art machen:
Nehmen wir die beiden Tabelle so an:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Tabelle_Neu:
ID    BEZEICHNUNG   NOCHEINFELD
--------------------------------
1     Bez 1         Bla
2     Bez 2         Blubb
3     Bez 3         Hollahü

Tabelle_Alt:
ID    BEZEICHNUNG   NOCHEINFELD
--------------------------------
1     Bez Neu       Hallo
2     Blubb         Test
5     Bez 5         -

1. Ergänzen der fehlenden Daten in Tabelle_Neu:
ausblenden SQL-Anweisung
1:
2:
INSERT INTO TABELLE_NEU (ID, BEZEICHNUNG, NOCHEINFELD)
SELECT ID, BEZEICHNUNG, NOCHEINFELD FROM TABELLE_ALT TA WHERE NOT EXISTS(SELECT ID FROM TABELLE_NEU TN WHERE TN.ID = TA.ID);

Tabelle_Neu sieht jetzt so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
ID    BEZEICHNUNG   NOCHEINFELD
--------------------------------
1     Bez 1         Bla
2     Bez 2         Blubb
3     Bez 3         Hollahü
5     Bez 5         -


2. Update der Daten:
ausblenden SQL-Anweisung
1:
2:
3:
4:
UPDATE TABELLE_NEU TN SET 
BEZEICHNUNG = (SELECT BEZEICHNUNG FROM TABELLE_ALT TA WHERE TA.ID = TN.ID),
NOCHEINFELD = (SELECT NOCHEINFELD FROM TABELLE_ALT TA WHERE TA.ID = TN.ID),
WHERE EXISTS(SELECT ID FROM TA WHERE TA.ID = TN.ID);

Ergebnis:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
ID    BEZEICHNUNG   NOCHEINFELD
--------------------------------
1     Bez Neu       Hallo
2     Blubb         Test
3     Bez 3         Hollahü
5     Bez 5         -


Hab jetzt alles aus dem Kopf getippt, aber im Prinzip müsste es so funktionieren.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Hazel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 26.04.13 10:48 
danke super lieb von dir :)
probiere es mal aus und melde mich falls ich noch hilfe benötige (was sicher der fall sein wird :D)
Hazel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 26.04.13 11:07 
also habs ausprobiert funktioniert bei mir nicht weil
meine 2 tabellen verschieden augebaut sind
bsp:

Tabelle 1:

Name Vorname Straße

Tabelle 2

Strasse Vorname Nachname Ort

jetzt als grobes beispiel also muss ich noch zuweisen welches feld zu welches passt :)

Kannst mir da nochmal helfen? :)
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 26.04.13 11:10 
Hast Du die SQL-Befehle verstanden, die ich Dir oben gepostet hast? Du musst doch nur noch die Feldnamen Deinen Gegebenheiten anpassen.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Hazel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 26.04.13 11:12 
sorry hab es erstmal nur versucht eine SELECT abfrage zu basteln und hab dabei mist gebaut^^
habs gerade versucht kommt ein fehler aber der hat was mit meiner Datenbank zutun werd mich mal dran setzten :)