SQL Statement INSERT wenn nicht vorhanden

Sesca

Benutzer
Beiträge
5
Hallo zusammen,

Ich hoffe ihr könnt mir weiterhelfen, ich rätsle gerade an einem SQL Statement herum und bin mir nicht sicher ob das überhaupt lösbar ist.

Ich habe eine Tabelle mit Objektdaten die ungefähr so aufgebaut ist:


tabelle.png


Ich möchte nun für jedes Objekt, sofern nicht vorhanden, einen Datensatz Attrib_Name = ADDITIONAL_DESCRIPTION hinzufügen.

Also ein Single Statement bei meinem Beispiel wäre:

INSERT INTO tabelle (Object_ID, Attrib_Name, Value_Text) VALUES (‘213’, ‘ADDITIONAL_DESCRIPTION’, ‘’)

Das Statement das ich benötige müsste aber erstmal die Object_IDs auslesen, prüfen ob ein Datensatz mit dem Attrib_Name ADDITIONAL_DESCRIPTION für die entsprechende ID vorhanden ist, wenn ja nichts tun wenn nein den Datensatz hinzufügen.

Ich würde sowas normalerweise mit PHP lösen komme aber nur über vorgegebenes Backend an die Datenbank ran bei dem ich nur SQL Statements benutzen kann und da bin ich gerade etwas überfordert.

Gibt es eine Möglichkeit sowas überhaupt mit SQL auszudrücken, hat jemand einen Ansatz für mich?
 
Werbung:
Code:
test=# create table sesca(id serial primary key, o_id int, a_name text, value text);
CREATE TABLE
test=*# copy sesca (o_id,a_name, value) from stdin;
Geben Sie die zu kopierenden Daten ein, gefolgt von einem Zeilenende.
Beenden Sie mit einem Backslash und einem Punkt alleine auf einer Zeile.
>> 212   desc   bla
>> 212   add_desc   blub
>> 213   desc   tral
>> 214   desc   random
>> \.
COPY 4
test=*# select * from sesca;
 id | o_id |  a_name  | value  
----+------+----------+--------
  1 |  212 | desc  | bla
  2 |  212 | add_desc | blub
  3 |  213 | desc  | tral
  4 |  214 | desc  | random
(4 Zeilen)

test=*# insert into sesca (o_id,a_name) select o_id, 'add_desc' from (select distinct o_id from sesca except select o_id from sesca where a_name = 'add_desc' group by o_id) foo;
INSERT 0 2
test=*# select * from sesca;
 id | o_id |  a_name  | value  
----+------+----------+--------
  1 |  212 | desc  | bla
  2 |  212 | add_desc | blub
  3 |  213 | desc  | tral
  4 |  214 | desc  | random
  5 |  214 | add_desc |
  6 |  213 | add_desc |
(6 Zeilen)

test=*#

Fingerübung mit PostgreSQL. Könnte ähnlich auch in M$SQL gehen.
 
Hallo akretschmer,

Wow, mit so einer ausführlichen Abfrage habe ich nicht gerechnet. Hab vielen Dank für deine Zeit und Hilfe. Jetzt heisst nur noch Daumendrücken ob das bei HSSQL auch klappt. :)

Möge das Karma dich für deine Gute Tat belohnen

LG Sesca
 
Nachtrag: Ich hab das Statement eben per MySQL getestet, was leider nur eine Fehlermeldung produziert hat. Es stellte sich heraus das EXCEPT leider kein Standart SQL Statement ist. Ich habe die Zeile mit NOT IN umgeschrieben dann hat es einwandfrei geklappt. Nochmals vielen Dank, das Statement so zu formulieren hätte mich Tage gekostet!
 
Warum fragst Du in M$SQL, wenn Du MySQL nutzt? EXCEPT ist übrigens SQL-Standard. Nur weil MySQL ist kann (wie sooooo vieles nicht) solltest Du nicht solch Schlußfolgerungen ziehen.
 
Ich hab es in MySQL jetzt getestet, weil ich an die DB für die ich das Statement benötige erst morgen wieder rankomme und die läuft wohl in HSQL wovon ich heute das erste mal gehört habe. Da das Programm auf Windows läuft dachte ich Microsoft SQL hört sich gut an, entschuldige wenn ich das falsche Forum missbraucht haben sollte.

Mein Fehler, bei "Standart" gehe ich davon aus das es eben Standart ist und bei allen Varianten funktioniert. Wenn etwas da läuft und dort nicht ist es zumindest in meinen Augen kein "Standart".

Ich bin Laie wie man wahrscheinlich merkt :) Vielen Dank nochmal!
 
Wenn etwas da läuft und dort nicht ist es zumindest in meinen Augen kein "Standart"
So nicht korrekt. Es gibt einige SQL-Definitionen / Standards, den Herstellern der verschiedenen Produkte steht es frei, diese Definitionen zu realisieren. Oder auch abzuwandeln. Oder auch falsch zu implementieren. Insbesondere MySQL beherrscht die 2 letzteren Varianten sehr gut.

Viele DB-Systeme laufen übrigens auch auf unterschiedlichen Betriebsystemen. Sogar Microsoft will sein MS-SQL nun auch auf Linux anbietet - oder tut dies bereits, bin mir nicht ganz sicher. Also, augfrund das Tatsache, daß X auf Y läuft sollte man auch keine Rückschlüsse für Z ziehen.

Standards sind was feines. Es gibt sooo viele, da findet jeder seinen passenden ...

</rant ende>
 
Werbung:
Zurück
Oben