Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Hallo Robert, > Mach' einmal das Folgende: > Gründe eine Tabelle "Test" mit nur einer Spalte, Primärschlüssel, einziger > Wert '1' > Mach' eine Abfrage > SELECT "test".*, "FzLu"."ItemID" "FzLu"."Anzahl" > FROM "FzLu", "test" WHERE ("FzLu"."FzTypID" = 10) Das ist zwar ein wenig "von hinten durch Knopfloch ins Auge" aber er funktioniert. Über die SQL-Konsole führt folgeder Befehlssatz zum erwünschten ergebnis: CREATE TABLE "tmp" ("FzID" INTEGER PRIMARY KEY); INSERT INTO "tmp" VALUES ('1'); INSERT INTO "FzA" SELECT "tmp".*, "FzLu"."ItemID", "FzLu"."Anzahl" FROM "tmp", "FzLu" WHERE ("FzLu"."FzTypID" = 10); DROP TABLE "tmp" Ok, das werde ich jetzt mal versuchen als SQL-Befehl in das entsprechende Makro einzubinden. Danke Gruß Lars - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Hallo Lars, > > > Teste mal > > INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" "FzLu"."Anzahl" > > FROM "FzLu" WHERE "FzLu"."FzTypID" = 10) > > Endet mit der Fehlermeldung: > 1: Unexpected token Fahrzeugausstattung Lieferumfang, requires FROM in > statement [INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" > "FzLu"."Anzahl"] > > Da schneit er die Angabe von zwei Spalten in einem VALUES-Argument > nicht zu vertragen. Mach' einmal das Folgende: Gründe eine Tabelle "Test" mit nur einer Spalte, Primärschlüssel, einziger Wert '1' Mach' eine Abfrage SELECT "test".*, "FzLu"."ItemID" "FzLu"."Anzahl" FROM "FzLu", "test" WHERE ("FzLu"."FzTypID" = 10) Wenn das klappt, dann hast Du die Spalten zusammen in einer Abfrage und kannst Dir die '1' sparen. Gruß Robert - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Am 03.11.07 schrieb Robert Großkopf <[EMAIL PROTECTED]>: > Hallo Lars, > > > > Was ich gerade um zu setzen versuche ist das "Kaufen eines neuen > > Fahrzeugs". Dazu muss zuerst in Fz ein neuer Datensatz angelegt > > werden, der auf den entsprechenden FzTyp verweißt. Das habe ich über > > ein Makro erledigt. Danach muss für das neue Fahrzeug der Liederumfang > > in die Ausstattungsliste übertragen werden, dazu wollte ich das SQL > > Kommando wissen. Anders ausgedrück: > > Ich suche ein SQL Kommando, dass mir in eine Tabelle (FzA) alle > > Einträge einer anderen Tabelle (FzLu) kopiert, > > Warum kopiert? Du willst doch eigentlich nur vorhandene IDs schreiben, oder? Nein, ich will zusammen mit der "Anschaffung" ein Fahrzeugs, dessen Lieferumfang "anschaffen". Da die tatsächliche Ausstattung eines tatsächlichen Fahrzeugs aber in einer anderen Tabelle abgelegt wird als der Lieferumfang eines Fahrzeugs müssen die entsprechenden Spalten des Entsprechenden Einträge des Liegerumfangs in die Tabelle der Fahrzeugausstattung kopiert werden. Sonst würde ich ja mit der Änderung der Beladung eines tatsächlichen Fahrzeugs die Serienausstattung mit ändern. Oder wolltest Du mich hintergründig auf eine elegantere Lösung aufmerksam machen? Dann mußt Du mir diese wohl ein wenig deutlicher erläutern. > Teste mal > INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" "FzLu"."Anzahl" > FROM "FzLu" WHERE "FzLu"."FzTypID" = 10) Endet mit der Fehlermeldung: 1: Unexpected token Fahrzeugausstattung Lieferumfang, requires FROM in statement [INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" "FzLu"."Anzahl"] Da schneit er die Angabe von zwei Spalten in einem VALUES-Argument nicht zu vertragen. Gruß Lars - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Hallo Lars, > > Was ich gerade um zu setzen versuche ist das "Kaufen eines neuen > Fahrzeugs". Dazu muss zuerst in Fz ein neuer Datensatz angelegt > werden, der auf den entsprechenden FzTyp verweißt. Das habe ich über > ein Makro erledigt. Danach muss für das neue Fahrzeug der Liederumfang > in die Ausstattungsliste übertragen werden, dazu wollte ich das SQL > Kommando wissen. Anders ausgedrück: > Ich suche ein SQL Kommando, dass mir in eine Tabelle (FzA) alle > Einträge einer anderen Tabelle (FzLu) kopiert, Warum kopiert? Du willst doch eigentlich nur vorhandene IDs schreiben, oder? > die eine bestimmte > Bedingung erfüllen (FzTypID = Fahrzeugtyp des neu gekauften > Fahrzeugs). Dabei werden auch der zweiten Tabelle aber nicht alle > Spalten benötigt (nur ItemID und Anzahl) und in die erste Spalte der > ersten Tabelle ist immer der gleiche Werte (FzID des neugekauften > Fahrzeugs) zu schreiben. Soweit klar. > Nach meinen Quellen ist die Angabe der Spalten, in die etwas > eingetragen werden soll optional. Werden die Spalten nicht angegeben, > müssen werte für jede vorhandene Spalte der Zieltabelle in der > richtigen Reihenfolge angegeben werden, was bei meinem Ansatz der Fall > war. (Siehe auch das Umkopieren von Thread "Komplizierte Abfrage") > > Ich habe inzwischen die Vermutung, dass ich das Problem eleganter mit > Union oder Join lösen kann. Die Einleitung des entsprechenden Kapitels > in meinen SQL-Buch klingt vielversprechend. Ich habe die Datenbank zum Ausprobieren nicht, aber hier einmal Deine Variante: INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl" FROM "FzLu" WHERE "FzLu"."FzTypID" = 10 Und dann mein Hinweis: VALUES endet mit der Schließung der Klammer. Teste mal INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" "FzLu"."Anzahl" FROM "FzLu" WHERE "FzLu"."FzTypID" = 10) Gruß Robert - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Hallo Reto, Hallo Robert, Hallo Liste, erstmal danke für eure Antworten, auch wenn sie noch nicht zu einer funktionierenden Lösung geführt haben. Robert schrieb: > Vielleicht verstehe ich auch die Frage nicht so ganz. Aber Du hast > ein Einfügekommando, dass nach dem Wert zu Ende ist. Willst Du > das nächste Kommando gleich hinterherschieben, so musst Du > mit ";" trennen. Das 2. Kommando ist eine ganz nurmale Abfrage, > hat meines Erachtens mit dem ersten überhaupt nichts zu tun. Um diese Unklarheiten zu beseitigen, werde ich die Aufgabe noch mal ausführlich beschreiben: Ich habe eine eine Tabelle mit Ausrüstungsgegenständen: Items(*ItemID, Bezeichnung, ...) 1 Werkzeugkasten 2 Warndreieck 3 Klappleiter 4 Verkehrsleitkegel In einer weiteren Tabelle sind Fahrzeugtypen gespeichert: FzTyp(*FzTypID, Bezeichnung, ...) 1 Einsatzleitfahrzeug (Jeep) 2 Einsatzleitfahrzeug (Van) 3 Rüstwagen ... Zwischen diesen beiden Tabellen gibt es ein n:m-Beziehung, die ausdrückt welchen Lieferumfang der jeweilige Fahrzeugtyp enthält. Diese Bezeihung ist durch eine weitere Tabelle realisiert: FzLu(*FzTypID, *ItemID, Anzahl) 1 2 1 1 4 10 3 1 3 3 3 2 ... Bisher habe ich in der Datenbank also die erhältlichen Fahrzeugtypen und ihren Lieferumfang gespeichert. Zum einen kann ich nun mehrere Fahrzeuge desselben Typs kaufen, zum anderen kann ich die Ausstattung dieser Fahrezuge nach dem Kauf verändern, deshalb gibt es die beiden Tabellen Fz(*FzID, FzTypID, ...) in der die tatsächlich vorhandenen Fahrzeuge gespeichert sind und FzA(*FzID, *ItemID, Anzahl) in der gespeichert wird welche Ausrüstung auf welchem Fahrzeug ist (n:m Relation zwischen Fz und Items). Was ich gerade um zu setzen versuche ist das "Kaufen eines neuen Fahrzeugs". Dazu muss zuerst in Fz ein neuer Datensatz angelegt werden, der auf den entsprechenden FzTyp verweißt. Das habe ich über ein Makro erledigt. Danach muss für das neue Fahrzeug der Liederumfang in die Ausstattungsliste übertragen werden, dazu wollte ich das SQL Kommando wissen. Anders ausgedrück: Ich suche ein SQL Kommando, dass mir in eine Tabelle (FzA) alle Einträge einer anderen Tabelle (FzLu) kopiert, die eine bestimmte Bedingung erfüllen (FzTypID = Fahrzeugtyp des neu gekauften Fahrzeugs). Dabei werden auch der zweiten Tabelle aber nicht alle Spalten benötigt (nur ItemID und Anzahl) und in die erste Spalte der ersten Tabelle ist immer der gleiche Werte (FzID des neugekauften Fahrzeugs) zu schreiben. Nun zu euren Vorschlägen: Reto schrieb: > Ich glaube du hast die Spalte vergessen anzugeben. Zwar weiss die > Datenbank nun dass du etwas in die Tabelle FzA schreiben willst, aber > nicht in welche Spalte: > INSERT INTO "FzA" (Spalte) VALUES (WERT) Nach meinen Quellen ist die Angabe der Spalten, in die etwas eingetragen werden soll optional. Werden die Spalten nicht angegeben, müssen werte für jede vorhandene Spalte der Zieltabelle in der richtigen Reihenfolge angegeben werden, was bei meinem Ansatz der Fall war. Reto machte noch folgenden Vorschlag: > INSERT INTO "FzA" (Spalte1,ItemID,Anzahl) VALUES ('1',(SELECT "ItemID" > FROM "FzLu" WHERE "FzTypID" = 10),(SELECT "Anzahl" FROM "FzLu" > WHERE "FzTypID" = 10)) An diesem Vorschlag paßt mir nicht, dass für ItemID und Anzahl zwei getrennte Abfragen gemacht werden, es ist aber wichtig, das ItemID und Anzahl aus dem selben Datensatz der abgefragten Tabelle stammen. Bringt diese Abfrage den Fehler "Single Value expected". Rober schlug vor: > INSERT INTO "AFz" (FzID) VALUES ('1'); > SELECT "FzLu"."ItemID" "FzLu"."Anzahl" > FROM "FzLu" WHERE "FzLu"."FzTypID" = 10 Hierbei handelt es sich doch um nacheinander abgearbeitete Anweisungen, oder. Das Ergebnis von Select soll aber geinsertet werde, wie oben beschrieben. Ich habe inzwischen die Vermutung, dass ich das Problem eleganter mit Union oder Join lösen kann. Die Einleitung des entsprechenden Kapitels in meinen SQL-Buch klingt vielversprechend. Gruß Lars - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Hallo Lars, > > LuFz (FzTypID, ItemID, Anzahl) > > AFz (FzID, ItemID, Anzahl) > > > INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl" > FROM "FzLu" WHERE "FzLu"."FzTypID" = 10 > Zuerst einmal: "FzA" oder "AFz"? "LuFz" oder "FzLu"? Dann INSERT INTO "AFz" (FzID) VALUES ('1'); SELECT "FzLu"."ItemID" "FzLu"."Anzahl" FROM "FzLu" WHERE "FzLu"."FzTypID" = 10 Vielleicht verstehe ich auch die Frage nicht so ganz. Aber Du hast ein Einfügekommando, dass nach dem Wert zu Ende ist. Willst Du das nächste Kommando gleich hinterherschieben, so musst Du mit ";" trennen. Das 2. Kommando ist eine ganz nurmale Abfrage, hat meines Erachtens mit dem ersten überhaupt nichts zu tun. Gruß Robert - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Hallo zusammen Ich wahr wohl zu voreilig: > INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl" > FROM "FzLu" WHERE "FzLu"."FzTypID" = 10 > INSERT INTO "FzA" (Spalte1,ItemID,Anzahl) VALUES ('1',(SELECT "ItemID" FROM "FzLu" WHERE "FzTypID" = 10),(SELECT "Anzahl" FROM "FzLu" WHERE "FzTypID" = 10)) So Sollte es eher gehen. Die Spalten sind natürlich noch richtig zu benennen. Zur Information was gemacht wurde: Mit dem Insert wurde gesagt, dass 3 Werte in die Tabelle "FzA" geschrieben werden sollen. Die Spalten, welche gefüllt werden sollen, sind in der ersten Klammer durch Kommas getrennt aufgelistet. Nach dem VALUES werden die Werte, die Eingeschrieben werden sollen, definiert. Dabei muss man darauf achten, dass die Reihenfolge mit der Reihenfolge der Spalten übereinstimmt. Da die Werte ItemID und Anzahl zuerst errechnet werden müssen, wird dies durch eine Unterabfrage erledigt. Unterabfragen stehen immer in Klammern und der Rückgabewert der Unterabfrage wird dann weiter verwendet. Du willst zwei Werte, so brauchst du meines Wissens auch zwei Unterabfragen. Sollte jemand eine einfachere oder bessere Lösung kennen, soll er es bitte sagen. Ich selber kenne mich mit SQL noch nicht so gut aus und lerne gerne noch dazu ;-) Gruss Reto - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Am Freitag, 2. November 2007 schrieb Lars Lehmann: > Hallo zusammen, > > ich möchte folgendes mit einem SQL Befehl erledigen: > > In der Tabelle "LuFz" ist der Lieferumfang von Fahrzeugen abgelegt: > > LuFz (FzTypID, ItemID, Anzahl) > > In einer weiteren Tabelle "AFz" ist die tatsächliche Ausstattung von > Fahrzeugen abgelegt (Schließlich kann man Austattung dazu kaufen oder > verkaufen.) > > AFz (FzID, ItemID, Anzahl) > > Die unterschiedlichen verfügbaren Fahrzeugtypen sind in einer eigenen > Tabelle "FzTypen" abgelegt. Der Fuhrpark in der Tabelle "Fz". Wenn ich > ein neue Fahrzeug "kaufe" soll nun folgenden passieren: > > 1. Anlegen eines neuen Datensatzes in "Fz" der auf den entsprechenden > Fahrzeugtyp verweist. Das habe ich inzwischen per Makro erledigt. > > 2. Kopieren der Lieferumfangs für diesen Fahrzeugtyp (in "LuFz") in > die tatsächliche Ausstattung unter Angabe der FzID der neuen > Fahrzeugs. > > Ich hab das erfolglos mit folgender Anweisung versucht. Dabei habe ich > der Einfachheit halber erstmal die FzID = 1 und den Fahrzeugtyp = 10 > gesetzt (Fahrzeug und Fahrzeugtyp gib es!) > > INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl" > FROM "FzLu" WHERE "FzLu"."FzTypID" = 10 Ich glaube du hast die Spalte vergessen anzugeben. Zwar weiss die Datenbank nun dass du etwas in die Tabelle FzA schreiben willst, aber nicht in welche Spalte: INSERT INTO "FzA" (Spalte) VALUES (WERT) > Anscheinend ist dieser SQL-Befehl aber falsch und mir gehen die Ideen aus. Ich denke dass es da dran liegt. Sollte es immer noch nicht gehen, schreibe auf jeden Fall wieder die Queries, die du versucht hast, ins E-Mail Gruss Reto - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
[de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden
Hallo zusammen, ich möchte folgendes mit einem SQL Befehl erledigen: In der Tabelle "LuFz" ist der Lieferumfang von Fahrzeugen abgelegt: LuFz (FzTypID, ItemID, Anzahl) In einer weiteren Tabelle "AFz" ist die tatsächliche Ausstattung von Fahrzeugen abgelegt (Schließlich kann man Austattung dazu kaufen oder verkaufen.) AFz (FzID, ItemID, Anzahl) Die unterschiedlichen verfügbaren Fahrzeugtypen sind in einer eigenen Tabelle "FzTypen" abgelegt. Der Fuhrpark in der Tabelle "Fz". Wenn ich ein neue Fahrzeug "kaufe" soll nun folgenden passieren: 1. Anlegen eines neuen Datensatzes in "Fz" der auf den entsprechenden Fahrzeugtyp verweist. Das habe ich inzwischen per Makro erledigt. 2. Kopieren der Lieferumfangs für diesen Fahrzeugtyp (in "LuFz") in die tatsächliche Ausstattung unter Angabe der FzID der neuen Fahrzeugs. Ich hab das erfolglos mit folgender Anweisung versucht. Dabei habe ich der Einfachheit halber erstmal die FzID = 1 und den Fahrzeugtyp = 10 gesetzt (Fahrzeug und Fahrzeugtyp gib es!) INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl" FROM "FzLu" WHERE "FzLu"."FzTypID" = 10 Anscheinend ist dieser SQL-Befehl aber falsch und mir gehen die Ideen aus. Gruß Lars - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]