Eratum Geschrieben 16. Juni 2016 Geschrieben 16. Juni 2016 Tach allerseits. Ich habe seit Ewigkeiten nichts mehr mit SQL gemacht und stehe nun etwas auf dem Schlauch. Sicher hat da draussen irgendjemand die total simple Antwort parat. Folgendes: Ich bin gerade dabei die installierte Software auf unseren Clients auf etwas abenteuerliche Weise zu erfassen. Dabei legt jeder Client mittels Skript einmal eine CSV mit seiner installierten Software und Version auf einem Share ab. Soweit so gut. Nun muss das Ganze auch zusammen geführt werden und da ich gerade "mal wieder was mit Access machen wollte", dachte ich mir, ich bastel da mal eine kleine "DB". Nun habe ich eine Datenbank mit 3 Tabellen, die ich automatisiert füllen möchte: Client (*ID, Name) Software (*ID, Name, Version) Client_SW (*Host_ID, *SW_ID) Die ersten Tabelle lassen sich Problemlos befüllen. Probleme bereitet es mir gerade die entsprechende Abfrage, den Insert, für die dritte Tabelle zu bauen. Mein Skript liefert mir bei Ausführung von: str_db_command = "INSERT INTO Client_SW ( [Host_ID], [SW_ID] ) VALUES (" _ & " ( SELECT ID FROM Clients WHERE [Hostname] = '" & str_hostname & "' )," _ & " ( SELECT ID FROM Software WHERE [Software] = '" & str_software & "' AND [Version] = '" & str_version & "'));" obj_ADOCon.Execute (str_db_command) diese Fehlermeldung: Zitat Microsoft JET Database Engine: Unbekannter Fehler Wenn ich das ganze "aufstrippe" und als SQL Query in Access laufen lassen: INSERT INTO Client_SW ( [Host_ID], [SW_ID] ) VALUES ( ( SELECT ID FROM Clients WHERE [Hostname] = 'xxx' ), ( SELECT ID FROM Software WHERE [Software] = 'xxx' AND [Version] = '123')); So bekomme ich die Meldung: Zitat Die Abfrage muss auf mindestens einer Tabelle oder Abfrage basieren. ... Wer kann mir hier einen Hinweis geben, wo ich 'nen Klemmer habe (oder vlt. hab' ich auch einen völlig sinnbefreiten Ansatz)? Schonmal danke für's durchlesen (die Antwort ist garantiert kürzer als meine Ausführung, aber ich merke gerade, dass ich mit "dem Kram" sowas von raus bin) Gruß Eratum Zitieren
Ganymed Geschrieben 16. Juni 2016 Geschrieben 16. Juni 2016 Heißt die Tabelle "Client" oder "Clients"? Zitieren
Kelsier Geschrieben 16. Juni 2016 Geschrieben 16. Juni 2016 (bearbeitet) Du hast einen Tippfehler im Tabellennamen: Clients statt Client Die Fehlermeldung möchte dir das wohl etwas umständlich mitteilen. Dürfte wohl dem "ORA-00942: table or view does not exist" entsprechen, nur eben in nicht sprechender Schreibweise von Access Bearbeitet 16. Juni 2016 von Kelsier Zitieren
Eratum Geschrieben 16. Juni 2016 Autor Geschrieben 16. Juni 2016 Öhm...Der Tipfehler liegt im Post. Die Tabelle heisst tatsächlich Clients Zitieren
Ganymed Geschrieben 16. Juni 2016 Geschrieben 16. Juni 2016 (bearbeitet) Ich hab lange kein Access SQL mehr gemacht (sieht gern mal anders aus als üblich ): https://support.office.com/de-de/article/INSERT-INTO-Anweisung-e12fd58b-33b1-479c-8221-e9f245ab8d24 Die ganzen "[]" sehen irgendwie seltsam aus. Die gehören mMn nicht da rein, wenn ich mir die Spezifikation durchlese. Und ich erinnere mich, dass unnötige Leerzeichen empfindliche Fehlermeldungen hervorrufen können. Bearbeitet 16. Juni 2016 von Ganymed Zitieren
Eratum Geschrieben 16. Juni 2016 Autor Geschrieben 16. Juni 2016 (bearbeitet) Eckige Klammern habe ich entfernt und (wahrscheinlich) unnötige Leerzeichen wegrationalisiert: INSERT INTO Client_SW (Host_ID,SW_ID) VALUES ((SELECT ID FROM Clients WHERE Hostname='xxx'),(SELECT ID FROM Software WHERE Software='yyy' AND Version='123')); Ebenso habe ich probiert mit Clients.ID, Software.ID, ... zu arbeiten. Die Meldung blieb die Gleiche. Ich hätte es doch einfach nach einer Exceltabelle exportieren sollen Aber nun will ich wissen woran es liegt Danke soweit! Dennoch: Weitere Vorschläge anyone? Bearbeitet 16. Juni 2016 von Eratum Zitieren
Kelsier Geschrieben 16. Juni 2016 Geschrieben 16. Juni 2016 (bearbeitet) Muss eigentlich an der Syntax liegen... In einem schnellen Oracle-Nachbau kann ich das ohne Probleme ausführen (mit Access kenn ich mich blöderweise gar nicht aus) Mag Access vielleicht kein einfaches Hochkomma und erwartet Double-Quotes? Kann Access überhaupt mit Subqueries umgehen? Bearbeitet 16. Juni 2016 von Kelsier Zitieren
Eratum Geschrieben 16. Juni 2016 Autor Geschrieben 16. Juni 2016 Also die Hochkommas passen so. Die funktionieren bei den anderen Abfragen und Inserts auch. Bei den Subqueries bin ich mir aktuell nicht 100% sicher (auch wenn ich das aus anderen Foren/Dokus so übernommen habe) und recherchiere nochmal. Hinzu kommt halt auch immer, dass ich hier mit nem Office 2007 arbeite Zitieren
Crash2001 Geschrieben 16. Juni 2016 Geschrieben 16. Juni 2016 Zu den eckigen Klammern, da kann ich zumindest etwas Klarheit schaffen: Eckige Klammern werden eigentlich nur bei reservierten Schlüsselwörtern benötigt. Ansonsten sind sie zwar nicht schädlich, man braucht sie aber auch nicht schreiben, da unnötig. Siehe hier. Zitieren
Eratum Geschrieben 16. Juni 2016 Autor Geschrieben 16. Juni 2016 Danke euch erstmal soweit. Ich schau' mir das morgen nochmal an Zitieren
Eratum Geschrieben 23. Juni 2016 Autor Geschrieben 23. Juni 2016 Ahoihoi, ich bin nun doch mal wieder dazu gekommen mich mit dem Thema zu befassen und hab's nun hinbekommen. Letztendlich ging es mir auf den Senkel, mich mit der SQL Syntax von MS mehr als nötig zu befassen. Also hab' ich mir das Access vorgenommen und mir nach einigem durchlesen und recherchieren in der Hilfe die benötigte Abfrage/ den Insert "zusammengeklickt". Ich kenn mich nicht gut genug mit SQL/Programmierung/DB aus um zu sagen, ob dieser Stil nun schön ist, aber er geht. Und hier nun der funktionierende Snippet: str_db_command = "INSERT INTO Client_SW ( Host_ID, SW_ID ) " _ & "SELECT Clients.ID, Software.ID " _ & "FROM Clients, Software " _ & "GROUP BY Software.Software, Clients.Hostname, Software.Version, Clients.ID, Software.ID " _ & "HAVING (((Software.Software)=""" & str_software & """) AND ((Clients.Hostname)=""" & str_hostname & """) AND ((Software.Version)=""" & str_version & """));" Und nochmal als "SQL": INSERT INTO Client_SW ( Host_ID, SW_ID ) SELECT Clients.ID, Software.ID FROM Clients, Software GROUP BY Software.Software, Clients.Hostname, Software.Version, Clients.ID, Software.ID HAVING (((Software.Software)="xxx") AND ((Clients.Hostname)="yyy") AND ((Software.Version)="123")); Nochmal danke an alle Beteiligten Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.