Seite 1 von 1

insert, wenn nicht vorhanden

Verfasst: Fr, 28. Okt 2022 18:20
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?

Re: insert, wenn nicht vorhanden

Verfasst: Sa, 29. Okt 2022 0:13
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.

Re: insert, wenn nicht vorhanden

Verfasst: Sa, 29. Okt 2022 7:35
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.

Re: insert, wenn nicht vorhanden

Verfasst: Sa, 29. Okt 2022 14:12
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)

Re: insert, wenn nicht vorhanden

Verfasst: Sa, 29. Okt 2022 21:45
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

Re: insert, wenn nicht vorhanden

Verfasst: So, 30. Okt 2022 0:32
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

Re: insert, wenn nicht vorhanden

Verfasst: So, 30. Okt 2022 0:40
von Werner_Bayern
Und meine funktioniert nicht bei ADS?

Re: insert, wenn nicht vorhanden

Verfasst: So, 30. Okt 2022 0:51
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.

Re: insert, wenn nicht vorhanden

Verfasst: So, 30. Okt 2022 12:01
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;
 

Re: insert, wenn nicht vorhanden

Verfasst: So, 30. Okt 2022 12:14
von Manfred
OK, jetzt habe ich es verstanden. Ich dachte ich dürfte nur INSERT nehmen.

Re: insert, wenn nicht vorhanden

Verfasst: So, 30. Okt 2022 12:21
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