Datensatz per SQL in Access mit Abfrage

Hallo zusammen,

Ich bin neu in Sachen SQL und kaum versucht man was entstehen riesige Schluchten der Unwissenheit :smile:

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“)

aber irgendwie funktioniert das nicht!

MfG
Enrico

Moin, Enrico,

aber irgendwie funktioniert das nicht!

mit irgendwie kommen wir nicht weiter. Das was Du erzählst sollte mit dem, was Access Dir erzählt, schon ein bisschen zu tun haben.

Auf den ersten Blick: Es gibt keine Spalten Bez1, Bez2, …

Auf den zweiten Blick ist mir völlig schleierhaft, was Du vorhast. Ich sehe eine 1:n- und gleichzeitig eine n:1-Beziehung, das ist eh Murks.

Gruß Ralf

Hallo Ralf,

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!

Enrico

Hallo Ralf,

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)

tblAircrafts
Registration (String) Primärschlüssel
MaxPax(integer)
Owner(String)
ID(Fremdschlüssel :stuck_out_tongue:)

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

Enrico

Moin, Enrico,

ich glaube wir reden völlig aneinander vorbei.

wohl wahr.

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.

Hi!

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)

Grüße,
Tomh

Moin, Tom,h

Selbstbezüglichkeiten „Insert into TX … (Select from TX)“

Halt!
Er meint ja ein „Insert into TXI … (Select from TXII)“

im Original:

tbllAircraft … tblAircraft

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 :wink:

Gruß Ralf

Hi!

tbllAircraft … tblAircraft

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 :wink:

Da sieht man wieder mal, dass es ab und zu hilfreich ist, mit Datenbankkonstruktionen konfrontiert zu werden, bei deren Namensgebung manch Schelm unterwegs war :wink:

Grüße,
Tomh

Hallo Ihr beide :smile:
Hm, es ist einfach faszinierend wie meine Namensgebung interpretiert wird… ich willst mal eben auseinander klabüstern…

tbl -Tabelle (und nein, der letzte Buchstabe ist KEIN i sonder ein L)
das I dahinter hab hab ich einfach dazwischen gemogelt als Synonym für ‚INFO‘…

und naja… der Rest stellt dann tatsächlich den Tabellennamen dar :smile:

Das funktioniert also nicht… und ich hatte es sooo sehr gehofft…

Danke euch beiden

Und Danke Ralf für Deine unendliche Geduld :smile:

Enrico

Neues Spiel, neues Glück
Hi ENrico,

ci h habe gerade ein Minimalbeispiel gestrickt, bin dabei über übelste Meldungen gestolpert und habe dann gesagt, jetzt is oiss wurscht:

**Aircraft** (<u>Aircraft</u>, ICAO)
**Registration** (<u>Registration</u>, FS\_Aircraft, maxpax)

 INSERT INTO Registration (FS\_Aircraft, maxpax)
 SELECT aircraft, 17 as maxpax
 FROM aircraft
 WHERE ICAO= "A3";

Und kaum machst man’s richtig, dann geht’s auch schon: ACCESS will an dieser Stelle keine Klammern um den Select herum und auch keine VALUES-Klausel.

Das Ganze ist fachlich natürlich immer noch Murks: ICAO darf nur einmal vorkommen, sonst knallt’s.

Gruß Ralf

Hallo Ralf,

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.

Ich habe Deinen Text mal so interpretiert:

Aircraft (Aircraft, ICAO)
Registration (Registration, FS\_Aircraft, maxpax)

sind Deine Tabellen

 INSERT INTO Registration (FS\_Aircraft, maxpax)
 SELECT aircraft, 17 as maxpax
 FROM aircraft
 WHERE ICAO= "A3";

bei Deinem SQL-Statment ist mir eines nicht so klar.
Deiner Tabelle Registration wird keine Wert für ‚Registration‘ übergeben, wo kommt sie her?

lg Enrico

Moin, Enrico,

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 :smile:)) 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.

Gruß Ralf

Hallo Ralf,

ich glaub ich bin so ne richtige Pest am Hals :smile:

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 :smile:)) 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!

Enrico

Moin, Enrico,

ich glaub ich bin so ne richtige Pest am Hals :smile:

nein, aber Du machst es einem nicht leicht.

Stell hier die komplette SQL-Anweisung ein, dazu den Namen der Spalte, die in der Eingabebox auftaucht.

Gruß Ralf