Joins returnen on Insert?

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
Mich würde interessieren, ob es eigentlich möglich ist, einen Insert (Gegebenenfalls auch in einer Funktion) einen Join returnen zu lassen, ich habe da eher so gedacht an eine Ausgabe ala:
"Maschine mit Nummer >Vermietungen.maschinen_id< des Typs >Typen.Typ< wurde zur Mietung eingetragen!"

Dass man bei einem Insert alle beliebigen Spalten der Tabelle, in die man inserted returnen kann, ist mir bewusst, aber ich würde gerne (ohne extra Spalten und Trigger einzurichten), eben den Maschinentyp der entsprechenden maschinen_id ausgeben.

Also meine Frage:
Wenn es möglich ist, wo in meiner Insert-Abfrage müsste ich den Join ansetzen?

Um eine Vorstellung an das ganze zu geben, hier ein funktonierender Code:
Code:
insert into vermietungen(maschinen_id, mietzeit) values ('2', '(2018-02-28 15:00, 2018-02-28 17:00)') returning maschinen_id, lower(mietzeit)::date, lower(mietzeit)::time,
upper(mietzeit)::date, upper(mietzeit)::time

Aber, ich würde gerne (klein anfangen, also am Anfang nur 1 Spalte) 1 Spalte returnen, welche mittels eines Joins erreichbar wäre.
Code:
insert into vermietungen(maschinen_id, mietzeit) values ('2', '(2018-02-28 15:00, 2018-02-28 17:00)') returning vermietungen.maschinen_id, maschinen_typen.typ, lower(vermietungen.mietzeit)::date, lower(vermietungen.mietzeit)::time,
upper(vermietungen.mietzeit)::date, upper(vermietungen.mietzeit)::time

Wobei die Spalte maschinen_typen.typ über die Tabelle Maschinen erreichbar wäre, welche 2 wiederum mit enem inner-join, glaube ich verbunden werden müssten. (?)

Wenn es nicht geht, einfach schreiben xD
 
Werbung:
Es geht, Funktion oder Trigger voraus gesetzt und ein Front-End was die Rückgabe von der DB auch entgegen nimmt. Bei einer Funktion würde man der Funktion die Werte für den Insert übergeben, diese macht den Insert und führt dann den Select aus, wie komplex dieser ist spielt dabei keine Rolle (Join ist also kein Problem). Bei einem Trigger würde entweder jeder Insert auf der Tabelle einen Join zurück liefern oder es muss für den Trigger erkennbar sein, wann das nicht passieren soll.
 
Der erste Schritt wäre mir gelungen, dass er die gesamte Tabelle "ausgibt", ich würde jedoch gerne nur die gerade eingetragene Miete abrufen.
(vor ca. 15 Minuten, und ich weiß schon nimmer, wie ichs hinbekommen habe), jedenfalls würde ich eben gerne nur die neueste abrufen.

(mir ist es nur so gelungen, dass er alles aus der Tabelle anzeigt, außer die neueste, sonst würde ich einfach desc ordern, und limit 1 setzen (außer, es gibt ... fortgeschrittener xD))

EDIT: wieder was neues gelernt, man kann sogar die Funktion als Tabelle "simulieren", bzw. macht das Postgres von selbst. (weil sonst Spalten doppelt vorkommen würden, kann man auch funktion.spalte wählen)

EDIT2: Sprich ich sollte die Funktion, mit der ich inserte deutlich mehr Werte "zurückgeben" lassen. (zwecks der Joins am Ende dann).

Setze mich gleich mal dahinter :D freut mich richtig ;)
 
Zuletzt bearbeitet:
Werbung:
Also, für alle die eine Lösung brauchen:
Code:
select mietbeginn.id, mietbeginn.maschinen_id, maschinen_typen.typ, maschinen_typen.mietpreis, mietbeginn.anfangsdatum, mietbeginn.anfangszeitpunkt, mietbeginn.enddatum, mietbeginn.endzeitpunkt
from mietbeginn('Normale', '2018-02-26 15:00') left join maschinen on mietbeginn.maschinen_id = maschinen.id inner join maschinen_typen on maschinen.typ = maschinen_typen.id

mietbeginn.id = new.vermietungen.id
mietbeginn.maschinen_id = die neu eingetragene maschinen_id in die tabelle vermietungen
maschinen_typen.typ = der typ der eingetragenen Maschine
maschinen_typen.mietpreis = der Mietpreis für den eingetragenen Typ
mietbeginn.anfangsdatum = das Datum, ab welchem die Mietung gilt
mietbeginn.anfangszeitpunkt = die Uhrzeit, ab welcher die Mietung gilt
mietbeginn.enddatum = das Datum, ab welchem die Mietung endet (vom eingetragenem Wert her (bei mir 4 lower(mietzeit)))
mietbeginn.endzeitpunkt = die Uhrzeit, ab welchem die Mietung endet (vom eingetragenem Wert her (bei mir 4 Stunden ab lower(mietzeit))

Die Werte die ich hineingeschrieben habe sind nur zum probieren (nach mietbeginn)
 
Zurück
Oben