Seite 1 von 1

Klassiker : Insert if not exists...

Verfasst: Mi 18. Apr 2018, 17:55
von Groffy
Hallo Zusammen,

in einem anderen Forum (Lazarus/Object Pascal) bin ich in eine Diskussion eingestiegen zu der Frage, wie man einen Datensatz nur dann einfügt wenn dieser noch nicht existiert. Alles in einem DSQL Statement :-)

Eine Syntax im einem if statement funktioniert nur in PSQL, folgende Vorschläge wurden gemacht :

Code: Alles auswählen

INSERT INTO Tablename (Fieldname1l, Fieldname2)
SELECT :Fieldname1l, :Fieldname2
FROM rdb$database
WHERE NOT EXISTS (SELECT 1 FROM Tablename WHERE Fieldname1l = :Fieldname1l)
und mein Vorschlag :

Code: Alles auswählen

update or insert into Tablename(Fieldname1l, Fieldname2) values ( :Fieldname1l, :Fieldname2) matching (:Fieldname1l)
wobei aber immer ein update ausgeführt wird falls der Datensatz schon existiert,

Es ginge auch noch über ein EXECUTE BLOCK und einem darin enthaltenen PSQL statement habe aber so etwas noch nicht benutzt.


Bietet Firebird da noch andere Lösungen für an?

Gruß Ulrich

Re: Klassiker : Insert if not exists...

Verfasst: Do 19. Apr 2018, 09:19
von martin.kerkhoff
Guten Morgen

vielleicht ist das ja ein Ansatz.

Code: Alles auswählen

MERGE INTO customers c
  USING (SELECT * from customers_delta WHERE id > 10) cd
  ON (c.id = cd.id)
  WHEN MATCHED THEN
    UPDATE SET name = cd.name
  WHEN NOT MATCHED THEN
    INSERT (id, name) values (cd.id, cd.name)
das "WHEN MATCHED" kann man weglassen
Über Performance kann ich nichts sagen, ein Test würde sich da schon m.E. lohnen

schönen, sonnigen Tag

Re: Klassiker : Insert if not exists...

Verfasst: Sa 21. Apr 2018, 22:30
von Groffy
Hallo Martin,

ja danke - die Lösung gefällt mir persönlich am besten. Ich muss gestehen, ich habe mich bislang noch nicht wirklich mit den Möglichkeiten des Merge Statements auseinandergesetzt.

Beste Grüße - Ulrich

Re: Klassiker : Insert if not exists...

Verfasst: Mo 7. Mai 2018, 18:16
von bfuerchau
Also der Merge ist da schon sehr performant, denn man kann alles in genau 1 Statement packen.
Man bedenke, dass man ansonsten ja 2 SQL's Richtung Server schicken muss, erst den Select und dann wahlweise Insert oder Update.
Ich benutze den i.Ü. sehr gerne.