insert, wenn nicht vorhanden

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

insert, wenn nicht vorhanden

Beitrag von Manfred »

irgendwie stelle ich mich ein wenig ungelenk an. Wie muß der SQl Befehl INSERT aussehen, wenn er nur angehängt werden darf, bei Nichtvorhandensein?

Code: Alles auswählen

INSERT INTO plz (plz) VALUES ('12345') WHERE NOT EXISTS (SELECT * FROM plz WHERE plz = '12345')
das klappt nicht. Muß da noch irgendwo ein Semicolon rein? Oder ist das WHERE falsch?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: insert, wenn nicht vorhanden

Beitrag von UliTs »

So lautet die Syntax:

Code: Alles auswählen

INSERT INTO <table-name> [WITH DELETE] [(<column-identifier>[, <column- identifier >]…)]
  VALUES (<data-values>[, <data-values>]…) [, (<data-values>[, <data-values>]…) … ]
Or
INSERT INTO <table-name> [WITH DELETE] [(<column- identifier >[, <column- identifier >]…)] query-specification
Or
INSERT INTO <table-name> [WITH DELETE] DEFAULT VALUES
Das heisst, meines Erachtens ist die von Dir verwendete Syntax falsch. Eigentlich hätte ich erwartet, dass es da zu einem Fehler bei der Ausführung kommt. Ohne es ausprobiert zu haben, müßte folgendes funktionieren:

Code: Alles auswählen

INSERT INTO <TableName> (<FieldName1>) select <FieldName1> from <TableName> where <FieldName1> = '12345'
Bei einer Tabelle Plz mit Feld Plz und einer Tabelle Adressen könnte dies z.B. so aussehen:

Code: Alles auswählen

INSERT INTO Plz (Plz) select Plz from Adressen where Plz='12345'
Edit:
Wenn es keinen Datensatz in Tabelle Adressen mit Plz='12345' gibt, wird auch kein Datensatz in Tabelle Plz angelegt.
Wenn es mehrere Datensätze mit Plz='12345' gibt, werden auch mehrere Datensätze angelegt. Will man das nicht, DISTINCT verwenden.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: insert, wenn nicht vorhanden

Beitrag von Manfred »

Hi Uli,
Danke für Deine Mühe, aber du bist komplett daneben. Ich möchte nur INSERT wenn der Satz noch nicht vorhanden ist. Sollte aber aus meiner Frage hervor gehen... Ich möchte also Mehrfacherfassung verhindern.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: insert, wenn nicht vorhanden

Beitrag von Werner_Bayern »

Servus Manfred,

unter PostgreSQL würde das so gehen:

Code: Alles auswählen

insert into plz (Plz) select 12345 where not exists (select plz from plz where plz = 12345)
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: insert, wenn nicht vorhanden

Beitrag von Marcus Herz »

Für ads:
Merge table
On Key = value
When not Matched then insert (fieldlist)
Values (.....)
When Matched then update set....

Man kann einen der beiden when Bedingungen auch weglassen. Lies in der Hilfe nach. Da gibts noch mehr
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: insert, wenn nicht vorhanden

Beitrag von UliTs »

Manfred hat geschrieben: Sa, 29. Okt 2022 7:35Danke für Deine Mühe, aber du bist komplett daneben. Ich möchte nur INSERT wenn der Satz noch nicht vorhanden ist. Sollte aber aus meiner Frage hervor gehen... Ich möchte also Mehrfacherfassung verhindern.
Hallo Manfred, schade, dass Du Dir nicht die Mühe gemacht hast, meine Antwort zu verstehen. Oder hast Du versehentlich den Hinweis bezüglich DISTINCT nicht verstanden? Dann Sorry!

Edit: wenn Du ausschließlich Value Werte einfügen willst, ist die Lösung von Marcus sicherlich die elegantere.
Edit2: Markus -> Marcus, sorry
Zuletzt geändert von UliTs am So, 30. Okt 2022 0:48, insgesamt 1-mal geändert.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: insert, wenn nicht vorhanden

Beitrag von Werner_Bayern »

Und meine funktioniert nicht bei ADS?
es grüßt

Werner

<when the music is over, turn off the lights!>
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: insert, wenn nicht vorhanden

Beitrag von UliTs »

Werner_Bayern hat geschrieben: So, 30. Okt 2022 0:40 Und meine funktioniert nicht bei ADS?
Nicht ganz. So müsste es beim ADS aussehen:

Code: Alles auswählen

insert into plz (Plz) select 12345 from system.iota where not exists (select plz from plz where plz = 12345)
Edit: system.iota ist eine Systemtabelle, die es beim ADS immer gibt und die aus genau einem Datensatz besteht.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: insert, wenn nicht vorhanden

Beitrag von nightcrawler »

MERGE ist vermutlich das effektivste:

Code: Alles auswählen

// create table plz(plz integer, ort cichar(50));
MERGE plz ON (plz=12345)
  WHEN NOT MATCHED THEN INSERT(plz, ort) VALUES(12345, 'Hamburg');
  
 SELECT * FROM plz;
 
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: insert, wenn nicht vorhanden

Beitrag von Manfred »

OK, jetzt habe ich es verstanden. Ich dachte ich dürfte nur INSERT nehmen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: insert, wenn nicht vorhanden

Beitrag von nightcrawler »

Mit Merge kannst Du halt noch mehr machen ...

Code: Alles auswählen

MERGE plz ON (plz=12345)
  WHEN MATCHED THEN UPDATE SET ort='Hamburg'
  WHEN NOT MATCHED THEN INSERT(plz, ort) VALUES(12345, 'Hamburg')
Für den Fall, dass bei 12345 Berlin drin steht.
Oder Du kannst zwei Tabellen miteinander vereinen ... im Fall eines Preislistenupdates, einer neuen Vorlagentabelle usw
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten