![]() |
Datenbank: Sybase Adaptive Server Anywhere Database Engine • Version: 8.0.2.4392 • Zugriff über: ODBC
Datensätze in die gleiche Tabelle kopieren?
Hi!
Wie kann man komplette Datensätze in einer Tabelle kopieren ohne den kompletten Inhalt vorher auf Variablen zu speichern? Ich habe schon versucht die Tabelle 2 mal zu öffnen und dann die aus der einen in die andere zu kopieren, aber das will nicht so recht funktionieren. Bin für jeden Gedankenanstoß dankbar.. MfG Prelude247 |
Re: Datensätze in die gleiche Tabelle kopieren?
Hallo und herzlich willkommen in der Delphi-PRAXiS.
Datensätze kopieren kannst du mit SQL:
SQL-Code:
Kann sein, dass du die genaue Beschreibung der Syntax in deiner Dokumentation nachschlagen musst.
INSERT INTO table (field1, field2) SELECT field1, field2 FROM table WHERE condition
Grüße vom marabu SQL-Statement korrigiert nach Hinweis von Flocke |
Re: Datensätze in die gleiche Tabelle kopieren?
SQL-Code:
Das VALUES muss man weglassen. Außerdem kannst du in der SELECT-Liste auch andere Werte einfügen, z.B. aus mit JOIN hinzugenommenen Tabellen, oder auch Konstanten.
INSERT INTO table (field1, field2)
SELECT field1, field2 FROM table WHERE condition |
Re: Datensätze in die gleiche Tabelle kopieren?
Danke für die schnelle Antwort!
Das mit dem SQL ist so 'ne Sache, da die Tabelle in der ich kopieren will aus fast 40 Feldern besteht. Ich dachte eher an eine Art Anweisung
Code:
Gibt es keine andere Möglichkeit :?:
Table1:=Table2;
MfG prelude247 |
Re: Datensätze in die gleiche Tabelle kopieren?
Hätte ich mich selbst
![]() Natürlich kannst du die vereinfachte Syntax verwenden - wenn du keine Probleme mit UNIQUE Klauseln hast:
SQL-Code:
marabu
INSERT INTO table SELECT * FROM table WHERE condition
|
Re: Datensätze in die gleiche Tabelle kopieren?
Habe nun versucht eine SQL-Anweisung zu erstellen um einen Datensatz zu kopieren.
Bei der Ausführung erhalte ich folgenden Fehler: "Unterabfrage nur in einem Element der Auswahlliste zulässig."
SQL-Code:
Ich bin bald am verzweifeln, denn ich finde den Fehler nicht. :wall:
INSERT INTO ARTIKELSTAMM
( ArtiStammId, ArtiStamBezeich, ArtiStamNummer, EKZ_Nummer, ArtGrNummer, ArtiFolgeTyp, ArtiInfoGruppe, ArtiPoolNummer, ArtiStamAuspr, ArtiStamBPoolKum, ArtiStamBeaKennz, ArtiStamBrutGew, ArtiStamEAN, ArtiStamEKDKennz, ArtiStamGewicht, ArtiStamGrundArt, ArtiStamLPreVari, ArtiStamLoeKennz, ArtiStamMatch, ArtiStamMxErntMg, ArtiStamOPreisSp, ArtiStamOPreisWa, ArtiStamPackBrei, ArtiStamPackHoe, ArtiStamPackLae, ArtiStamPrAzGrMe, ArtiStamPrAzMeBz, ArtiStamPrEinhEK, ArtiStamPrEinhVK, ArtiStamPreVari, ArtiStamRundBest, ArtiStamRundEK, ArtiStamRundVK, ArtiStamSaatTyp, ArtiStamTyp, ArtiStamUPreisSp, ArtiStamUPreisWa, ArtiStamVKDKennz, ArtiStamVerpGew, ArtiStamVolumen, ArtiStamXPrEinsp, ArtiStamZulBDat, ArtiStammIdEkGrp, ArtiStammImage, DSD_MatGrNummer, DSD_VolGrNummer, FilTransfer, ME_GrupNummer, ME_NummerVerpGew, PrKalkSchema, PreisMatNummerEK, PreisMatNummerVK, Reinheitsgrad, SaatFruNummer, SaatSortNummer, SteuerSchluessel, VerpackGruppe, WaGruNummer, artiStamPrAzUFak ) VALUES ( 17134,'Absperrventil Form A','999910',70, ( SELECT ArtGrNummer, ArtiFolgeTyp, ArtiInfoGruppe, ArtiPoolNummer, ArtiStamAuspr, ArtiStamBPoolKum, ArtiStamBeaKennz, ArtiStamBrutGew, ArtiStamEAN, ArtiStamEKDKennz, ArtiStamGewicht, ArtiStamGrundArt, ArtiStamLPreVari, ArtiStamLoeKennz, ArtiStamMatch, ArtiStamMxErntMg, ArtiStamOPreisSp, ArtiStamOPreisWa, ArtiStamPackBrei, ArtiStamPackHoe, ArtiStamPackLae, ArtiStamPrAzGrMe, ArtiStamPrAzMeBz, ArtiStamPrEinhEK, ArtiStamPrEinhVK, ArtiStamPreVari, ArtiStamRundBest, ArtiStamRundEK, ArtiStamRundVK, ArtiStamSaatTyp, ArtiStamTyp, ArtiStamUPreisSp, ArtiStamUPreisWa, ArtiStamVKDKennz, ArtiStamVerpGew, ArtiStamVolumen, ArtiStamXPrEinsp, ArtiStamZulBDat, ArtiStammIdEkGrp, ArtiStammImage, DSD_MatGrNummer, DSD_VolGrNummer, FilTransfer, ME_GrupNummer, ME_NummerVerpGew, PrKalkSchema, PreisMatNummerEK, PreisMatNummerVK, Reinheitsgrad, SaatFruNummer, SaatSortNummer, SteuerSchluessel, VerpackGruppe, WaGruNummer, artiStamPrAzUFak FROM ArtikelStamm WHERE ArtikelStammID=551 )) MfG Prelude247 |
Re: Datensätze in die gleiche Tabelle kopieren?
Du darst VALUES und SELECT nicht mischen, aber du kannst die Konstanten in die SELECT-Abfrage mit einbauen:
SQL-Code:
[Nachtrag]
INSERT INTO ARTIKELSTAMM
( ArtiStammId, ArtiStamBezeich, ArtiStamNummer, EKZ_Nummer, ArtGrNummer, ArtiFolgeTyp, ArtiInfoGruppe, ArtiPoolNummer, ArtiStamAuspr, ArtiStamBPoolKum, ArtiStamBeaKennz, ArtiStamBrutGew, ArtiStamEAN, ArtiStamEKDKennz, ArtiStamGewicht, ArtiStamGrundArt, ArtiStamLPreVari, ArtiStamLoeKennz, ArtiStamMatch, ArtiStamMxErntMg, ArtiStamOPreisSp, ArtiStamOPreisWa, ArtiStamPackBrei, ArtiStamPackHoe, ArtiStamPackLae, ArtiStamPrAzGrMe, ArtiStamPrAzMeBz, ArtiStamPrEinhEK, ArtiStamPrEinhVK, ArtiStamPreVari, ArtiStamRundBest, ArtiStamRundEK, ArtiStamRundVK, ArtiStamSaatTyp, ArtiStamTyp, ArtiStamUPreisSp, ArtiStamUPreisWa, ArtiStamVKDKennz, ArtiStamVerpGew, ArtiStamVolumen, ArtiStamXPrEinsp, ArtiStamZulBDat, ArtiStammIdEkGrp, ArtiStammImage, DSD_MatGrNummer, DSD_VolGrNummer, FilTransfer, ME_GrupNummer, ME_NummerVerpGew, PrKalkSchema, PreisMatNummerEK, PreisMatNummerVK, Reinheitsgrad, SaatFruNummer, SaatSortNummer, SteuerSchluessel, VerpackGruppe, WaGruNummer, artiStamPrAzUFak ) SELECT 17134,'Absperrventil Form A','999910',70, ArtGrNummer, ArtiFolgeTyp, ArtiInfoGruppe, ArtiPoolNummer, ArtiStamAuspr, ArtiStamBPoolKum, ArtiStamBeaKennz, ArtiStamBrutGew, ArtiStamEAN, ArtiStamEKDKennz, ArtiStamGewicht, ArtiStamGrundArt, ArtiStamLPreVari, ArtiStamLoeKennz, ArtiStamMatch, ArtiStamMxErntMg, ArtiStamOPreisSp, ArtiStamOPreisWa, ArtiStamPackBrei, ArtiStamPackHoe, ArtiStamPackLae, ArtiStamPrAzGrMe, ArtiStamPrAzMeBz, ArtiStamPrEinhEK, ArtiStamPrEinhVK, ArtiStamPreVari, ArtiStamRundBest, ArtiStamRundEK, ArtiStamRundVK, ArtiStamSaatTyp, ArtiStamTyp, ArtiStamUPreisSp, ArtiStamUPreisWa, ArtiStamVKDKennz, ArtiStamVerpGew, ArtiStamVolumen, ArtiStamXPrEinsp, ArtiStamZulBDat, ArtiStammIdEkGrp, ArtiStammImage, DSD_MatGrNummer, DSD_VolGrNummer, FilTransfer, ME_GrupNummer, ME_NummerVerpGew, PrKalkSchema, PreisMatNummerEK, PreisMatNummerVK, Reinheitsgrad, SaatFruNummer, SaatSortNummer, SteuerSchluessel, VerpackGruppe, WaGruNummer, artiStamPrAzUFak FROM ArtikelStamm WHERE ArtikelStammID=551 Wenn ArtikelStammId eine Auto-Id ist, dann solltest du sie beim INSERT weglassen (und unten natürlich nicht mit angeben). |
Re: Datensätze in die gleiche Tabelle kopieren?
Hallo,
wie Flocke schon geschrieben hat, musst du das Values weglassen Die folgend SP hab ich mal für FB1.0 gemacht, ich hoffe das funzt auch mit deinem Server:
SQL-Code:
Wie man sieht stammen die Werte der 2 ersten Spalten nicht aus der Ursprungstabelle.
ALTER PROCEDURE SP_COPYZEILEN (
ID_ZIEL INTEGER, ID_QUELLE INTEGER) AS begin Insert into Zeilen select null, -999, ZEILENNO, ANZAHL, DATUM, BESCHREIBUNG, EPREIS, GPREIS, WAEHRUNG FROM ZEILEN where F_AR = :id_quelle; Update zeilen set F_Ar = :id_ziel where F_AR = -999; suspend; end PS.: Wenn ich mir den SQl-Code von meiner SP so angucke: Das ist doch fürchterlich unelegant. Das müsste doch eigentlich besser gehen. Hat dazu jemand mal eine Idee? :wall: Roter Kasten. Flocke war schneller mfg wo |
Re: Datensätze in die gleiche Tabelle kopieren?
Es funktioniert! :-D
Danke euch beiden für die schnelle Hilfe! Der Feierabend ist gerettet! MfG Prelude247 |
Re: Datensätze in die gleiche Tabelle kopieren?
Hallo zusammen !!
Sorry, daß ich diesen Beitrag nochmal hochhole aber hat jemand eine Idee warum das beschriebene Verfahren mit der BDE und Paradox nicht funktioniert. Laut LocalSQL-Help sollte es funktionieren. Folgendes führt zur Meldung "Keine Übereinstimmung der Typen im Ausdruck." Die CAST's hab ich erst nach diesem Fehler eingebaut. Leider keine Wirkung !! FLAECHE und TERMIN sind der Primärschlüssel, die Reihenfolge der Felder stimmt. Ich hab auch schon die Zielfelder aufgezählt. Aber ohne Erfolg.
Delphi-Quellcode:
... oder nur das SQL Statement
SQL.Clear;
SQL.Add ('Insert Into Haustemperatur Select Flaeche,Cast((Termin+:ZeitWert) as DATE),Cast((Jahr+:Diff) as INTEGER),0, Temp_Tag,Temp_Nacht,0 from HausTemperatur where Jahr='+IntToStr(JahrSource)); ParamByName ('Zeitwert').asDateTime:=EncodeDate(JahrZiel+1,1,1)-EncodeDate(JahrZiel,1,1); ParamByName ('Diff').asInteger:=Diff; ExecSQL;
SQL-Code:
Insert Into Haustemperatur
Select Flaeche,Cast((Termin+:ZeitWert) as DATE),Cast((Jahr+:Diff) as INTEGER),0,Temp_Tag,Temp_Nacht,0 from HausTemperatur where Jahr=2005 .. für Hilfe wäre ich dankbar |
Re: Datensätze in die gleiche Tabelle kopieren?
Guten Morgen,
auch LocalSQL unterstützt INSERT INTO SELECT. Offensichtlich erzeugst du einen Ausdruck vom falschen Typ. Fehler-Kandidaten sind Termin und Jahr, die du beide verändert übertragen möchtest. Jahr dürfte ein Integer-Feld sein, der korrekte Ausdruck ist dann JAHR + :iYears wobei iYears auch als Integer übergeben werden muss. Bei Termin lässt du mich raten. Als Date-Feld wäre der korrekte Ausdruck Termin + :iDays wobei iDays die Zahl der Tage ist, welche auf das Datum aufgerechnet werden soll. CAST() brauchst du hauptsächlich dann, wenn Typanpassungen für Zeichenverkettungen vornehmen musst oder zwischen Binär- und Texttypen hin und her wandeln musst. Grüße vom marabu |
Re: Datensätze in die gleiche Tabelle kopieren?
@Marabu
... vielen Dank für die schnelle Antwort. :thumb: Den Verdacht hatte ich auch schon. Deswegen die CAST's. Werde das nachher gleich ausprobieren. Termin ist übrigens DATETIME, wie du schon richtig vermutet hattest. Werde das nachher gleich ausprobieren... nochmals Danke. |
Re: Datensätze in die gleiche Tabelle kopieren?
@marabu
... habe die Anweisungen folgendermaßen angepasst
Delphi-Quellcode:
...und jetzt bringt er mir den Fehler "Merkmal nicht verfügbar". :wall: Die Spaltenbezeichnungen sind alle richtig und auch keine AutoInc-Felder. Irgendwelche Ideen ???
var Diff : integer;
begin If SourceJahr<>TargetJahr then begin Diff:=TargetJahr-SourceJahr; DM.ProgressWork ('Temperaturen '+IntToStr(TargetJahr)+' einfügen',' ',' ',' ',0); with DM.Query_Betrieb4 do begin hs:='Insert Into Haustemperatur.db (Flaeche,Termin,Jahr,Temp_Tag,Temp_Nacht) '; hs:=hs+' Select Flaeche,Termin+:ZWert,Jahr+:Diff,Temp_Tag,Temp_Nacht from HausTemperatur.db where Jahr='+IntToStr(SourceJahr); SQL.Clear; SQL.Add (hs); ParamByName ('ZWert').asInteger:=Trunc(EncodeDate(TargetJahr+1,1,1)-EncodeDate(SourceJahr,1,1)); ParamByName ('Diff').asInteger:=Diff; ExecSQL; end; end; end; nochmal kurz zur Tabellenstruktur.. Flaeche ist INTEGER / Termin ist DATE ===> beide Primärschlüssel Jahr,Temp_Tag,Temp_Nacht sind Integer |
Re: Datensätze in die gleiche Tabelle kopieren?
Zitat:
|
Re: Datensätze in die gleiche Tabelle kopieren?
Handelt es sich um einen zusammengesetzten Schlüssel? Davon würde ich Abstand nehmen und einen künstlichen Schlüssel einführen.
|
Re: Datensätze in die gleiche Tabelle kopieren?
@Hansa
...zusammengesetzter Primärschlüssel sorry. @mkinzler ...ich habe einen künstlichen Schlüssel erzeugt. Erstmal als AutoInc Feld, sicher nicht schön aber schnell und einfach. ---> gleiches Problem. (Ich hatte den AutoInc nicht im INSERT INTO.) Neuer Versuch mit künstlichem Primärschlüssel CHAR[30] zusammengesetzt aus Cast(Flaeche as Char(15))+Cast(Termin as Char(15)) ---> gleiches Problem "Merkmal nicht verfügbar" Das INSERT INTO müßte ja auch ohne Index funktionieren. Also Index gelöscht. ---> gleiches Problem Ratlosigkeit macht sich breit.... ich hoffe nur bei mir.... ??? |
Re: Datensätze in die gleiche Tabelle kopieren?
Zitat:
|
Re: Datensätze in die gleiche Tabelle kopieren?
@mkinzler
...ja ist schon klar, ich hab den Versuch mit dem AutoInc Typ INTEGER mit aufgezählter Feldliste, aber ohne den AutoInc in der selbigen gemacht. Ergebnis =>> Merkmal nicht verfügbar. Ich hab die Sache jetzt zwischenzeitlich über eine CopyTabelle gelöst. Ist bei ca. 10000 Datensätzen/Jahr und 10-20 Jahren Simulation noch ausreichend performant. Die andere Lösung wäre natürlich eleganter aber die BDE gibts scheinbar nicht her.... :cry: pfui, pfui, pfui ich wollte doch nicht schon wieder auf die BDE schimpfen. :wink: Trotzdem danke für die schnelle Hilfe... |
Re: Datensätze in die gleiche Tabelle kopieren?
Hallo,
ich war durch die Schlüssel-Diskussion etwas abgelenkt, bin aber durch den Begriff CopyTabelle aufgeschreckt: Die BDE verlangt bei INSERT INTO SELECT zwei verschiedene Tabellen. Die Fehlermeldung "Merkmal nicht verfügbar" ist da nicht besonders aussagekräftig, leider. Die Verwendung einer einzigen Tabelle "Haustemperatur" hatte ich bei meinem ersten Beitrag übersehen und mich auf das vordergründige Syntaxproblem konzentriert. Verlegene Grüße |
Re: Datensätze in die gleiche Tabelle kopieren?
@marabu
verzeihende..? na mal sehen...? ok! freundliche Grüße zurück :wink: ...daß die BDE INSERT INTO SELECT nur mit 2 Tabellen erlaubt habe ich jetzt auch rausbekommen. :? Meine Frage ist jetzt aber : Woher weißt Du das ? :?: In der LocalSql.hlp, bei Ebner, Kowalski, Nannen, Toolbox usw. steht nichts dergleichen. Immer nur in 3 Sätzen die üblichen Sachen (Values,Select usw.) abgehandelt. War's doch die Kristallkugel?, oder Altersweisheit ? :gruebel: |
Re: Datensätze in die gleiche Tabelle kopieren?
Zitat:
|
Re: Datensätze in die gleiche Tabelle kopieren?
@mkinzler
ok... dann bin auch ich jetzt um mind. eine Erfahrung reicher. Nochmals Danke an alle. |
Re: Datensätze in die gleiche Tabelle kopieren?
Hallo Leute,
Zitat:
Zitat:
Zitat:
Nachdenkliche Grüße |
Re: Datensätze in die gleiche Tabelle kopieren?
@marabu
... puh, das ist aber verdammt eng. :lol: Da braucht man Erfahrung !! Und das mit dem Zettel... nun mach uns mal keine Angst ! :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz