Du kannst Dir das so vorstellen:
Eine beliebige Tabelle, nennen wir sie "Insert Tabelle" gibt per
Select * from "Insert Tabelle"
ihren Inhalt aus. Damit sind nicht nur Daten ausgegeben, sondern auch eine Struktur: Reihenfolge und Spaltentypen.
Jedes von Dir geschriebene Select, das nun ein oder mehrere Datensätze produziert, die ein gleich strukturiertes Ergebnis liefern, kannst Du in einem Insert Statement für diese "Insert Tabelle" verwenden. Aus wieviel Ursprungstabellen dein eigenes Select besteht, ist dabei vollkommen egal, es muss nur analog zur Struktur der "Insert Tabelle" sein.
Um das Ganze etwas flexibler zu gestalten, kannst Du im Insert wie gewohnt, die Spalten benennen, die relevant sind. Entsprechend musst Du das Select Statement zur Befüllung adaptieren. Hat Deine Insert Tabelle 50 Spalten, Du willst aber nur 5 per Select befüllen, kannst Du auf diesem Weg alles beliebig anpassen. Nur die Struktur der selektierten Datensätze muss zur Struktur der Spalten der "Insert Tabelle" passen. (und natürlich der Inhalt/Bedeutung)
Also:
INSERT INTO t_buchungen (KUNDENID) SELECT KUNDENID FROM t_kunde WHERE KUNDENID = 1, INSERT INTO t_buchungen (FAHRTENID) SELECT FAHRTENID FROM t_fahrt WHERE FAHRTENID = 1;
wird zu
Code:
INSERT INTO t_buchungen
(kundenid, fahrtenid)
SELECT kundenid, fahrtenid
FROM t_kunde k
JOIN t_buchungen b
ON k.kundenid = b.kundenid
WHERE kundenid = 1
AND fahrtenid = 1
Dieses Statement gibt im übrigen nicht so viel Sinn, da es fast identisch ist zu:
Code:
INSERT INTO t_buchungen
(kundenid, fahrtenid)
VALUES (1,1)
Ich nehme an, dass es zu Testzwecken ist. Der einzige Unterschied: Das obere Statement könnte mehrere Datensätze liefern, die dann brav alle eingefügt werden, sofern dort definierte Table Constraints das nicht verhindern.
Natürlich ist das Statement sowieso nur anhand Deiner Fehlermeldung geraten. Aber so könnte es aussehen.