Einen Insert erstellen, wenn ein DS gemäß Where-Bedingung nicht vorhanden ist

SRXXL1964

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich lerne gerade SQL etwas intensiver und habe Folgendes Problem:

Ich möchte einen DS in einer Tabelle hinzufügen, wenn es diesen noch nicht gibt
INSERT INTO Tabelle (firma, ZMGNR, TAHDNR, FORMEL)
SELECT firma, zmgnr, '09', '01' FROM Tabelle WHERE firma=1 and ???

Hier ein Beispiel:
SELECT * FROM ZMTARIF WHERE firma=1 and zmgnr='001'
Ergebnis:
1737627063724.webp
Hier würde ich mir wünschen, dass dann ein DS eingetragen wird, der folgende Daten enthält:
1;001;09;01

In diese Tabelle soll also ein DS eingefügt werden, wenn es dort diesen nicht gibt, also wenn TAHDNR='09' nicht vorhanden ist. Geht das so überhaupt
mit einem Befehl?

Ich bin für jeden Hinweis dankbar!
 
Werbung:
Ja, das geht, aber die Bedingung TAHDNR='09' ist unzureichend.
Du musst eine vollständige Bedingung formulieren, bei der genau der fehlende Datensatz rauskäme, wenn er da wäre. Nicht der einer anderen Firma, mit einer anderen zmgnr usw.

Du brauchst das Insert mit allen Konstanten, die eingefügt werden müssen, die natürlich weitgehend identisch zu den Kriterien in der Suchbedingung sein werden.
Code:
Insert into zmtarif (firma, zmgnr, tahdnr, formel) 
Select(1,'001','09','irgendeine formel') 
  from zmtarif
 where not exists 
      (select 1 from zmtarif 
        where (firma, zmgnr, tahdnr) = (1,'001','09')
Du kannst die Insert Zeile erstmal weglassen und das Select darunter einfach so probieren, die Bedingungen testen usw.
Dieses Statement setzt voraus (beim Insert), dass es einen Mechanismus gibt, der einen Primärschlüssel automatisch setzt. Vielleicht sind auch die eingefügten Werte zusammen der Primärschlüssel, das kann man anhand Deiner Angaben nicht sagen.
 
Bei dem unteren Teil der "where not exists" komme ich mit dem letzten "where" nicht klar.

Du schreibst "where (firma, zmgnr, tahdnr) = (1,'001','09')". Meintest Du
where firma=1 and zmgnr='001' and tahdnr='09' ??

So oder so kommt das nicht hin.
Aber trotzdem Danke für Deine Mühen!
 
Ja, das ist das gleiche, kann der MSSQL vielleicht nicht. Hab ich nicht drauf geachtet.

"Kommt nicht hin" hilft dann aber nicht weiter.
Wollte mit dem "kommt so oder so nicht hin" schnell ausdrücken, dass mein gewünschtes Ergebnis damit nicht erreicht wird. Ich gucke mir dass später nochmal in Ruhe an und würde das Ergebnis posten. Danke bis hierhin.
 
Werbung:
Es gibt eine ganze Reihe an Möglichkeiten das in ein Statement zu bringen, NOT EXISTS ist sicherlich schon mal ganz gut. Mir gefällt nicht so gut, das du im Prinzip alle oder einige Werte mehrfach einsetzen musst, also im INSERT und im WHERE-Teil. Das könntest du mit WITH lösen, alternativ könnte man auch mit EXCEPT arbeiten.

Beispiel NOT EXISTS + WITH
Code:
WITH i(firma, zmgnr, tahdnr, formel) AS (
SELECT 1,'001','09','irgendeine formel'
)
INSERT INTO zmtarif (firma, zmgnr, tahdnr, formel)
SELECT i.firma, i.zmgnr, i.tahdnr, i.formel
FROM i
WHERE NOT EXISTS ( SELECT 1/0 FROM zmtarif z WHERE z.firma=i.firma AND z.zmgnr=i.zmgnr AND z.tahdnr=i.tahdnr )

Beispiel EXCEPT
Code:
INSERT INTO zmtarif (firma, zmgnr, tahdnr, formel)
SELECT 1,'001','09','irgendeine formel'
EXCEPT
SELECT firma, zmgnr, tahdnr, formel
FROM zmtarif

Es gibt auch noch MERGE, das ist mir aber irgendwie suspekt. Ich hatte da mal Probleme mit, leider weiß ich nicht mehr genau, warum :-)

Bleibt es denn bei dem einen Datensatz pro INSERT?
 
Zurück
Oben