Ich bin neu in Sachen SQL und kaum versucht man was entstehen riesige Schluchten der Unwissenheit
ich habe 2 Tabellen die in etwa so aussehen
Tabelle1:
ID(Schlüssel)
Bezeichner1(eindeutig,indiziert)
Bezeichner2
Bezeichner3
Tabelle2:
Bezeichner1(Schlüssel)
ID (Beziehung 1:n mit ID zu Tabelle1(Tabelle1=1, Tabelle 2= n ^^))
Bezeichner2
Bezeichner3
Bezeichner4
nun versuch ich Daten in Tabelle2 einzufügen:
INSERT INTO Tabelle2(Bez1,ID,Bez2,Bez3,Bez4) VALUES(„nix“,(SELECT ID FROM Tabelle1 WHERE Bezeichner1 = „irgendwas“),„bisschen“,„viehlmehr“)
ich hab mich wahrscheinlich (wie so oft) etwas kompliziert ausgedrückt!
ich habe eine tabelle mit einigen string-Spalten und einer ID, wobei ein stringfeld ebenfalls eindeutig ist.
und eine Zweite Tabelle in der ich Einträge einfügen möchte die sich aber auf Zeilen der 1. Tabelle Beziehen und mithilfe der ID eindeutig identifiziert werden können! Nun will ich mir also sparen erst die ID festzustellen, zwischen zu speichern und dann in den neuen Datensatz der 2. Tabelle einzufügen!
Ich habe also den wert für das eindeutige Stringfeld und möchte die passende ID aus der 1.Tabelle festellen und den neuen datensatz in Tabelle2 speichern in einem schritt!
also wie beschrieben in etwas so:
INSERT INTO Tabelle2(Bez1,ID,Bez2,Bez3,Bez4) VALUES(„nix“,(SELECT ID FROM Tabelle1 WHERE Bezeichner1 = „irgendwas“),„bisschen“,„viehlmehr“)
aber die Select-Anweisung ist irgendwie falsch, weiss nun leider nicht wie das richtig aussehen sollte!
Ich hoffe das war nun ein bisschen verständlicher!
ich glaube wir reden völlig aneinander vorbei.
Mir geht es letztendlich nur darum wie ich eine abfrage erstelle, welche einen neuen Datensatz in eine Tabelle schreibt. Dabei stammt ein wert aus einer anderen Tabelle der innerhalb der Abfrage geholt und in den neuen Datensatz integriert werden soll! Hm… ich kann schlecht die ganze Tabelle hier Posten um das vielleicht etwas verständlicher zu machen… Ich versuchs trotzdem mal.
tblIAircrafts hat folgende Felder
ID (long) Primärschlüssel
ICAO (String)
Company (String)
Series (String)
Wake (string)
In der Tabelle ‚tblIAircrafts‘ findet sich das Feld ICAO was fast eindeutig ist über diesen Wert soll die ID aus Tabelle tblIAircrafts geholt werden (bei doppelten Einträgen reicht mir die erste gefundene ID, soll später noch so überarbeitet das ICAO eindeutig ist, aber dafür fehlt mit im Moment die Zeit)
meine Gedankenansatz war nun einfach das mit folgendem SQL Statment zu tun!
INSERT INTO tblAircrafts(Registration,MaxPax,Owner,ID) VALUES(„passende Registration“,47,„Fumanchuairlines“,(SELECT ID FROM tblIAircrafts WHERE ICAO = ‚A3‘))
Allerdings funktioniert das mit der Unterabfrage nicht, die verursacht einen Fehler: „Die Abfrage muss auf mindestens einer Tabelle oder Abfrage basieren“
phu, hoffentlich konnte ich mein problem was deutlicher machen
Allerdings funktioniert das mit der Unterabfrage nicht, die
verursacht einen Fehler: „Die Abfrage muss auf mindestens
einer Tabelle oder Abfrage basieren“
da liegt der Hund begraben1: Die Jet-Engine2 wird mit derartigen Selbstbezüglichkeiten „Insert into TX … (Select from TX)“ nicht fertig. Du wirst Dir eine andere Lösung einfallen lassen müssen, zu dem Fehler weiß nichtmal Microsoft was zu sagen (die schämen sich).
Gruß Ralf
1Was glaubst Du denn, warum ich auf dem „irgendwie“ herumreite?
2Von Access weiß ich definitiv, dass sowas nicht geht. Ich bin noch nicht dazugekommen, das Konstrukt in (zB) Sybase nachzustellen.
Selbstbezüglichkeiten „Insert into TX … (Select from TX)“
Halt!
Er meint ja ein „Insert into TXI … (Select from TXII)“
Allerdings würde ich sowas in Oracle mithilfe eines INSERT-AS-SELECT machen:
insert into TXI values (string1, string2, ... , ID)
as
select 'Wert fuer string1','Wert fuer string2', ... , id
from TXII where code='eindeutiger Wert'
Geht das in Access nicht? (Bin zu faul, um es auszuprobieren)
das habe ich nicht als römisch 2, sondern als Zitterfinger
beim Schreiben des tbl gehalten, weil mir die Deklaration der
Tabellen nicht so wichtig war
Da sieht man wieder mal, dass es ab und zu hilfreich ist, mit Datenbankkonstruktionen konfrontiert zu werden, bei deren Namensgebung manch Schelm unterwegs war
hm… scheint zu funktionieren… zumindest bekomm ich die fehlermeldung das der datensatz nicht eingefügt werden kann wegen NULL oder Regelverletzung. Ich musste mir das natürlich etwas umstricken und sieht nun wie folgt aus:
INSERT INTO tblAircrafts ( Registration, MaxPax, Owner, CC, CY, [TimeStamp], ID )
SELECT „D-ABAK“ AS Registration, 47 AS MaxPax, „Fumanchuairlines“ AS Owner, 2 AS CC, 4 AS CY, NOW() AS [TIMESTAMP], tblIAircraft
FROM tblIAircrafts
WHERE ICAO=„A3“;
allerdings werd ich nun nach einem wert gefragt mittels einer Eingabebox.
allerdings werd ich nun nach einem wert gefragt mittels einer
Eingabebox.
mach’s mir doch nicht so schwer. Nach welchem Wert?!? Die Eingabe wird generiert für Spaltennamen, die es in Deiner Tabelle nicht gibt.
Deiner Tabelle Registration wird keine Wert für ‚Registration‘
übergeben, wo kommt sie her?
Das ist ein Autowert )) Und wo käme Deiner her? Wenn Du da jedesmal schreiben musst SELECT „D-ABAK“ AS Registration, dann kannst Du die Tabellen gleich von Hand befüllen.
mach’s mir doch nicht so schwer. Nach welchem Wert?!?
Die Eingabe wird generiert für Spaltennamen, die es in Deiner
Tabelle nicht gibt.
Nach tblIAircraft! habs auch schon probiert mit tblIAircraft.ID
hat aber keine Änderung zur folge gehabt!
Deiner Tabelle Registration wird keine Wert für ‚Registration‘
übergeben, wo kommt sie her?
Das ist ein Autowert )) Und wo käme Deiner her? Wenn Du da
jedesmal schreiben musst SELECT „D-ABAK“ AS
Registration , dann kannst Du die Tabellen gleich von Hand
befüllen.
naja ganz so einfach nun auch wieder nicht! die Werte werden zwar schon von Hand eingegeben, aber nach speziellen vorgaben… eine Registration hat beispielsweise immer konstant 6 Zeichen, 5 davon Alphanumerisch und 1 trennzeichen! Alle anderen angaben spezifizieren den Datensatz! Dieses Tabelle eignet sich also kaum für autowerte! Was das von Hand eingeben betrifft, so will ich tunlichst verhindern das irgendwer der das nachher mitbenutz direkten Zugriff auf die DB hat. Soll ja keiner drin blödsinn treiben… naja ausser mir!