![]() |
Datenbank: Mysql • Version: 5 • Zugriff über: DBX
3 Taabellen,ausdünnen
Ich hätte schon wieder eine Anfängerfrage.
Aus einer Tabelle mit Namen "Position", habe ich eine weitere Tabelle "KatalogPos" gemacht, die aus der "Position" nur die Katalogware enthällt. Nun muss ich aus der Tabelle KatalogPos alle Angebote raus löschen, die in der Tabelle Position im gleichen Angebot eine andere Position als Katalogware enthällt. Beispiel: Angebot 777 Pos1: KatalogArtikel Angebot 777 Pos2: SonderArtikel Angebot 777 Pos3: Katalogartikel Also würde die Regel hier zuschlagen. Anderes Beispiel Angebot 454 Pos1 KatalogArtikel Angebot 454 Pos2 KatalogArtikel Angebot 454 Pos3 KatalogArtikel Angebot 454 Pos4 KatalogArtikel Hier würde die Regel nicht zuschlagen. Die Erstellung der zweiten Tabelle KatalogPos wurde mit
Delphi-Quellcode:
gemacht.
kopiere:='insert into katalogpos Select * From Position where SparteBez LIKE ''%Katalog%'' ;';
Daraus habe ich eine dritte Tabelle mit Namen "Temp" gemacht.
Delphi-Quellcode:
Das flutscht auch ganz schnell(22000 Datensätze).
kopiere:='insert into Temp Select * From Katalogpos ;';
Um diejenigen zu finden, die zu löschen sind habe ich das geschrieben:
Delphi-Quellcode:
Das läuft auch soweit, ca 2 Minuten. Dann bricht das Programm die MYSQL-Serververbindung ab.
//Prüfen ob es zu einem Angebot eine ander Position gibt, die keine Katalogware ist
cdsKat.First; //CDSKat geht auf KatalogPos while not cdskat.Eof do begin angebot:=cdskat.FieldByName('AngbNr').AsString; sql:='Select * from Position where AngbNr= '''+Angebot+''';'; if SDSPos.Active=True then SDSPos.Active:=False; if CDSPos.Active=True then CDSPos.Active:=False; sdsPos.CommandText:=sql; CDSPos.Active:=True; SDSPos.Active:=True; if cdspos.RecordCount >1 then begin bez:='';p:=0; CDSpos.First; while not cdspos.Eof do begin bez:=cdspos.FieldByName('SparteBez').AsString; p:=pos('Katalog',bez); if p = 0 then begin delete1:='Delete from Temp where AngbNr= '''+Angebot+''';'; if SDSTemp.Active=True then SDSTemp.Active:=False; //CDSTemp und SDSTemp geht auf die Temp if CDSTemp.Active=True then CDSTemp.Active:=False; sql:='Select * From Temp'; sdsTemp.CommandText:=delete1; sdsTemp.ExecSQL(True); sdsTemp.CommandText:=sql; sdsTemp.Active:=true; cdsTemp.Active:=true; cdsTemp.ApplyUpdates(-1); end; cdspos.Next; end; end else begin cdspos.Next; end; cdskat.Next; end; Vermutlich habe ich etwas im kreis rumgeschrieben. Kann man sowas nicht besser lösen? Ich sehe es nicht. Danke für Eure Hilfe. |
AW: 3 Taabellen,ausdünnen
Frage doch beim Insert gleich alle Bedingungen auf einmal ab ..
Das geht per SQL recht einfach.
Code:
-- Einfügen in Tabelle "KatalogPos"
INSERT INTO KatalogPos -- alle Spalten und Datensätze aus Tabelle "Position" SELECT * FROM Position -- bei denen: WHERE -- die Angebotsnummer nicht enthalten ist, in AngbNr NOT IN -- der Liste eindeutiger Artikelnummern aus Tabelle Position, die eine andere "SparteBez" als 'KatalogArtikel' haben. ( SELECT DISTINCT AngbNr FROM Position WHERE SparteBez <> 'KatalogArtikel' ); Hinweis: LIKE %% ist deutlich langsamer als ein direkter Vergleich (<> 'KatalogArtikel'). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 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